对象的三个相关特性
1 原型对象
2 对象的类
3 对象的可拓展性
三类Js对象及两类属性
1 内置对象
2 宿主对象
3 自定义对象
4 自有属性
5 继承属性
思考:以上的概念是否清楚?
创建对象的方式
//对象直接量 var a={x:1} //通过new创建对象,a()是一个函数调用,new a()实际是及创建了一个继承自a()的对象 var a=new a(); //通过Object对象的静态方法 Object.create()
思考1:以上3个方法如何创建空对象?
思考2:我们如何在实现一个静态函数?
经典代码 :通过原型继承创建一个新对象
function inherit(p){ if(p===null) throw TypeError; if(Object.create){ return Object.create(p); } var t=typeof p; if(t!=='object'&&t!=='function') throw TypeError; function f(){} f.prototype=p; return new f(); }
查询对象的两种方式:. 及[" "] ,[" "]与for in 循环配合使用,for in 循环的是对象中可枚举的自有属性及继承属性
JavaScript对象都是关联数组,只不过每一项的下标不是数字而是属性名
访问对象属性的一种简写
var len=book && book.subtitle && book.subtitle.length
&&运算符除了返回true,false外,还会返回真假值,当运算符左侧的值为真时,返回值为右侧的值,以此类推
删除属性
delete 属性时需要循环遍历属性中的属性,防止内存泄漏
deiete 不能删除不可配置的属性
检测属性
三个方法
in //自有属性+继承属性 hasOwnProperty() //自有属性 propertyIsEnumerable() //自有属性+可枚举属性
存储器属性
var p={ x:1, get r() {return x}, set r(value) {this.x=value} }
属性的特性
数据属性的4个特性:value(值),writeable(可写),enumerable(可枚举),configurable(可配置)
存储器属性的4个特性:get(读取),set(写入),enumerable(可枚举),configurable(可配置)
获取对象属性特性的方法
Object.getOwnPropertyDescriptor(object,propertyName)
设置对象属性特性的方法
Object.defineProperty(object,propertyName,{ value: 1, writeable: true, enumerable: true, configurable: true })
Object.defineProperties(object,{
param1:{
value:,
writeable:,
enumerable:,
configurable:
},
param2...
})
一个经典的继承函数
Object.defineProperty(Object.prototype,'extend',{ value:function(o){ var names=Object.getOwnPropertyNames(o);//得到对象的所有自有属性,包括不可枚举的属性 Object.keys() 获取对象的自有属性 for(var i=0;i<names.length;i++){ if(names[i] in this) continue; var desc=Object.getOwnPropertyDescription(o,names[i]); Object.defineProperty(this,names[i],desc); } } })
检测对象原型的方法
Object.getPrototypeOf()获取一个对象的原型
__proto__属性用于查询/设置对象的原型
查询对象的类
一个经典的方法
function classof(o){ if(o===null) return 'Null'; if(o===undefined) return 'Undefined'; return Object.prototype.toString.call(o).slice(8,-1); }
对象的可扩展性
三个方法
Object.preventExtensions();//对象不可扩展 Object.seal();//对象不可扩展+属性不可配置 Object.freeze();//对象不可扩展+属性不可配置+只读(不包括存储器属性的setter方法)
对象的序列化
JSON.stringify() //只能序列化对象可枚举的自有属性