对象
1.1、除了字符串、数字(直接量或字面量)、布尔类型、null和underfined外,JavaScript的值都是对象。
尽管不是对象,但字符串、数字和布尔值经常在进行调用的时候被包装起来,所以这些数据类型更像是不可变的对象。如
'hello'.replace('h', 'H'); //,实际上是 String('hello').replace('h', 'H')
1.2、对象的属性特性
ECMAScript5
- writable 可写
- configurable 可配置
- enumerable 可枚举
1.3、对象特性
- prototype 原型对象
- class 类标识,字符串
- isExtensible 布尔型,可否扩展
1.4、三种JavaScript对象和两种属性
- 内置对象 数组、函数、日期、正则表达式等
- 宿主对象 HTMLElement对象等表示宿主结构的对象,实际上是JavaScprit迁入的宿主对象的内置对象
- 自定义对象 通过动态代码创建的对象
- 自有属性 对象中定义的属性
- 继承属性 从原型对象中继承的属性
1.5、对象创建
- 对象直接量 {key : value, key1 : value1},在IE7及之下的版本中直接量不可用逗号结尾,其他版本和其他主流浏览器中将忽略这个逗号
- new new Object();
- 原型对象(prototye) 直接用树形结构,二叉树来理解即可,或者就是族谱,你是你爸妈生的,你的原型对象是你爸妈,往上可以一直迭代到初代。
- Object.create ECMAScript5中定义用来创建基于prototype的新对象。
2.1、属性的查询与设置
- 通过.和[]
- 任何时候对属性的设置都是对象属性的设置,而不是原型对象的属性设置,原型对象的属性只有在查询时被读取,相当于一个默认值
2.2、delete
- 只是断开属性之间的引用关系,并没有去操作属性的属性。如 delete o.one; 如果o.one里面还有其他属性,并不被删除,只是无法再通过o.one访问
- 在严格模式下 delete在某些情况下会报错(错误标识、不可配置的属性)
2.3、检测属性
- in
- hasOwnProperty()
- propertyIsEnumerable()
- !== underfined
2.4、遍历属性
- for in
- Object.keys()
- Object.getOwnPropertyNames()
2.5、属性描述符
- Object.getOwnPropertyDescriptor()
- {writable : false, configurable : false, enumerable : false, value : null}
- Object.defineProperty() 、 Object.defineProperties()
- Object.defineProperty(object, 'name', {writable : false, configurable : false, enumerable : false, value : null})
- Object.defineProperties(object, {
one : {writable : false, configurable : false, enumerable : false, value : 1},
two : {writable : false, configurable : false, enumerable : false, value : 2}
})
- 不可扩展的,可编辑已有属性,不可添加新属性
- 不可配置的,不能修改可配置属性和可枚举属性
- 存取器不可配置,则不可修改get和set,也不能转换成数据属性
- 数据属性不可配置,不能转换成存取器属性,可写性可从true改成false,不能反向转换
- 数据属性不可配置且不可写的属性不能修改,可配置不可写的属性值可以修改(可以修改成可写,修改完属性再配置成不可写)。
扩展了一下一些属性,把代码贴上
Object.defineProperties && Object.defineProperties(Object.prototype, { 'extend': { writable: true, enumerable: false, configurable: true, value: function (o) { // 得到所有的自有属性 var names = Object.getOwnPropertyNames(o), name = null; for (var i = 0; i < names.length; i++) { name = names[i]; // 如果属性已经存在,跳过 if (name in this) continue; // 获取属性描述符 var desc = Object.getOwnPropertyDescriptor(o, name); // 用它给this创建一个属性 Object.defineProperty(this, name, desc); } } }, 'class': { enumerable: true, configurable: true, get : function () { return Object.prototype.toString.call(this).slice(8, -1); } } });
2.6、可扩展性
- Object.isExtensible() 是否可扩展
- Object.preventExtensions() 转换成不可扩展
- Object.seal() 封闭,会将所有自有属性都转换成不可配置的,已经设置为不可写的将无法再更改(无法解封)
- Object.isSealed() 是否封闭
- Object.freeze() 冻结所有属性,比seal更严格,把可写的属性也变成不可写的,存取器不受影响
- Object.isForzen() 是否冻结
3.1、JSON
- JSON.stringify() return string
- JSON.parse() return json object