6 对象
6.1 创建对象
6.1.1 对象直接量
var point = { x:1,y:2};
6.1.2 new
var o = new Object();
6.1.3 原型
每一个js对象(除了null)都和另一个对象相关联
直接量创建的对象通过:Object.prototype 获取对原型的引用。
new创建的对象的原型和构造函数.prototype。如:new Array(),原型为Array.prototype。但同时也继承自Object.prototype。(原型链)
var a = {};
var b = new Object();
Object.prototype.name = function(){
console.log('my name is a');
};
a.name(); // my name is a
b.name(); // my name is a
6.1.4 object.create()
Object.create(args1, [args2]) 的原型:args1。args2可选
6.2 属性的查询和设置
object.property
object["property"] 方括号呃逆必须是一个计算结果为字符串的表达式。
继承
var u = {r:1};
var c = inherit(u);c继承属性r
c.x = 1;c.y = 2;
c.r = 3; c覆盖继承来的属性
console.log(c.r);//1 原型对象没有修改
6.3 删除属性
delete 删除对象的属性。只是断开属性和宿主对象的联系,不会操作属性中的属性
6.4 检测属性
in 、
hasOwnPreperty()、检测给定的名字是否是对象的自有属性。
propertyIsEnumerable() 只有对象的自有属性且可枚举
!== 判断一个属性是否是undefined,区分null和undefinend.
6.5 枚举属性
for/in可以在循环体中遍历对象中所有可枚举的属性(自有和继承属性),把属性名赋值给循环变量。
对象继承内部属性不可枚举,添加的属性可枚举。
ES5 两个枚举属性的方法
Object.keys() //返回数组
Object.getOwnPropertyNames() //返回数组,
6.6 属性getter 和setter
getter 和setter 属于存取器属性,不具有可写性
数据属性只有一个简单的值
var o = {
//数据属性
name: 'smy',
sex: '女',
//存取器属性
set operationSex (_sex) {
this.sex = _sex;
},
get operationSex () {
return this.sex;
}
}
console.log(o.sex);
console.log(o.operationSex);
o.operationSex = 'dhr';
console.log(o.sex);
6.7 属性的特性
一个属性包含一个值和四个特性
数据属性:值value, 可写性writable,可枚举 enumerable, 可配置configurable
存取器属性:读取get, 写入set, 可枚举enumerable, 可配置configurale
查看某个对象特定属性值
Object.getOwnPropertyDescriptor(obj, attr);
Object.getOwnPropertyDescriptor({x: 1,"x"}); //Object {value:1, writable: true, enumerable: true, configurable: true}
修改一个属性
Object.defineProperty(obj, attr, {})
同时修改多个属性
Object.defineProperties(obj, { attr1: {}, attr2: {} });
6.8 对象的三个属性
原型属性
isPrototypeOf()检测一个对象是否是另一个对象的原型 与instanceof 相似
类属性
classof
可扩展性
Object.esExtensible(obj) //判断该对象是否可扩展
Object.preventExtensions(obj) //转换为不可扩展 转换不可逆
6.9 序列化
JSON.stringify()、JSON.parse() 用来序列化和还原js对象。
6.10 对象方法
toString()
toLocaleString()
toJSON()
valueOf()