js面向对象的程序设计 --- 上篇(理解对象)
前言
ECMAScript中没有类的概念,因此它们的对象与基于类的语言中的对象有所不同。
ECMA-262把对象定义为:"无序的集合属性,其属性可以包含基本值,对象或者函数"。正因为这样,我们可以把ECMAScript想象成散列表:
无非就是一组名值对,其中值可以是数据或者函数,
每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型 ·理解对象
·属性类型
ECMA-262定义了只有自内部才用指定特性时,描述了属性的各种特征。ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javascript
中不能直接访问它们。为了表示特性是内部值,该规范把它们放在两对儿方括号中,例如:[[Enumerable]]
1. 数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入。数据属性有4个描述其行为的特性
·[[CONFIGURABLE]] : 能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
直接在对象上定义的属性,它们的这个特性默认值为true
·[[Enumerable]] : 表示能否通过 for-in 循环返回出行 。 默认 true
·[[Writable]] : 表示能否修改属性的值。 默认 true
·[[Value]] : 包含这个属性的数据值。读取属性的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认为undefined 2. 访问器属性
访问器属性不包含数据值;它们包含一对getter 和 setter 函数 (不过,这两个函数都不是必需的)。
·[[CONFIGURABLE]] : 能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
直接在对象上定义的属性,它们的这个特性默认值为true
·[[Enumerable]] : 表示能否通过 for-in 循环返回出行 。 默认 true
·[[Get]] : 在读取属性时调用的函数。默认值为undefined
·[[Set]] : 在写入属性时调用的函数。默认值为undefined ·心得:ECMAScript中并没有直接定义一个属性是数据属性还是访问器属性。
根据个人心得:
如果直接指定了get 特性或者 set 特性,那么就是访问器属性。如果指定了任何数据属性特性中的一个,那么就是数据属性。
如果没有把 CONFIGURABLE 设为false ,那么数据属性和访问器属性可以互相转换
<script>
var person = {name : "Leo"}; // 定义访问器属性
Object.defineProperty(person,"style",{
configurable : false,
get : function () {
return "style:"+this.name;
},
set : function (value) {
this.name = value;
} });
console.log(person.style); // 触发访问器属性的get方法 // 输出style:Leo
person.style = 'mystyle'; // 触发访问器属性的set方法 // 输出style:mystyle
console.log(person.style); // 修改为数据属性
Object.defineProperty(person,"style",{
value : '' // 访问器属性以及定义了 configurable : false ,即表示不能把属性定义为数据属性,还强行定义,自然就报错了
}); </script>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script> // 由于对象定义多个属性的可能性非常大。ECMAScript5又定义了一个Object.defineProperties() 方法。
// 这次,我们把数据属性和访问器属性放在一个方法里面
var book = {};
Object.defineProperties(book,{
__year : {
writable : true ,
value : 2004,
},
edition : {
writable : true,
value : 1,
},
year : {
get : function () {
return this.__year;
},
set : function (newValue) {
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
} }
})
// 使用ECMAScript5的Object.getOwnPropertyDescriptor() 方法,可以取得给定属性的描述符
var descriptor = Object.getOwnPropertyDescriptor(book,'__year');
console.log(descriptor); //{value: 2004, writable: true, enumerable: false, configurable: false}
console.log(Object.getOwnPropertyDescriptor(window,'year')); //{get: ƒ, set: ƒ, enumerable: false, configurable: false}
// 记住: 在ECMAScript中,可以针对任何对象使用Object.getOwnPropertyDescriptor() 方法,包括DOM对象和BOM对象
</script>
</body>
</html>
js面向对象的程序设计 --- 上篇(理解对象)的更多相关文章
- JS面向对象的程序设计之理解对象
一.对象定义 (1)ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同: (2)ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数” 二. ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- javascript 面向对象程序设计--深刻理解对象
javascript中,每个对象都是基于一个引用类型创建的,我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 深刻理解对象 创建自定义对象的最简单方式就 ...
- JS面向对象的程序设计
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承
一.理解对象 二.创建对象 1. 工厂模式 2. 构造函数模式 3. 原型模式 4. 组合使用构造函数模式和原型模式[使用最广泛] 5. 动态原型模式 ...
- js的面向对象的程序设计之理解继承
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(六) 先来解析下标题——对象和继承~ 一.对象篇 ECMA-262把对象的定义为:&qu ...
- 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- js面向对象的程序设计 --- 下篇 继承启蒙
继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...
随机推荐
- java-标准输入
package InputDemo; public class InputDemo1 { public static void main(String[] args) { /* 1. java.uti ...
- JMeter接口测试-JMeter+ant实现接口自动化测试
前言 小伙伴们,用python做接口自动化是不是写代码比较繁琐,而且没有python代码基础的小伙伴根本无从下手对吧!今天我们来学习一下如何使用JMeter工具实现接口自动化测试. 1.安装JDK,配 ...
- JS基础-内置对象【字符串+Date+Math】
JS内置对象[字符串] // charAt() 返回字符 // charCodeAt() 返回字符的unicode编码 var str="hello world"; console ...
- Android之碎片Fragment
Fragment是个特别的存在,有点像报纸上的专栏,看起来只占据页面的一小块,但是这一小块有自己的生命周期,可以自行其是,仿佛独立王国,并且这一小块的特性无论在哪个页面,给一个位置就行,添加以后不影响 ...
- linux基础之磁盘管理与文件系统
上面一篇文章(https://www.cnblogs.com/ckh2014/p/7224851.html)介绍了硬盘的基本结构,那么一块磁盘如何应用取存储数据呢? 它的步骤是这样的: 识别硬盘 -- ...
- [THUSC2016]成绩单 [区间dp]
简单区间dp. 考虑 \(f_{i,j,mn,mx}\)表示 \(i,j\) 区间的最大值为 \(mx\),最小值为 \(mn\) 的最小花费,\(g_{i,j}\) 为删掉 \([i,j]\) 的最 ...
- c#在类里不能使用Response解决方法
response对应的类是HttpResponse, 在System.Web 命名字间里, 如果你在类中要使用 Response 的话, 需要使用System.Web.HttpConte ...
- PTA 1002 A+B for Polynomials
问题描述: This time, you are supposed to find A+B where A and B are two polynomials. Input Specification ...
- html5的页面在IOS中,按钮 变成圆角怎么办?
在button的css 中添加: -webkit-appearance: none; border: none; border-radius: 0; ok 的啦 文章来源:刘俊 ...
- VS中关于数据库的操作
1.数据库迁移 第一步: 第二步: 在窗口中选择项目中的EntitiyFramwork项目(与数据库连接的文件集) 第三步: 输入update-database 二:数据对比 第一步: 第二步:选择需 ...