Object对象
JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象。Object本身也是一个构造函数,可以直接通过它来生成新对象。
通过new Object() 的写法生成新对象,与字面量的写法 o = {} 是等价的。
对象属性
对象中包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。
var obj={}; obj[1]=1;//Object{1:1} obj['1']=2;//Object{1:2} //会把[]内转换为字符串
属性值有value值、get/set方法,writable、enumerable、configurable属性标签。
属性读写
function foo(){ } foo.prototype.z=3; var obj=new foo(); typeof obj.toString;//'function',基类方法 'z' in obj;//true obj.hasOwnProperty('z');//false 本身的属性 obj.z=5 foo.prototype.z;//still 3 delete obj.z;//true 不能继续删除原型链 obj.z;//still 3
get/set方法(存取器)
var man={ get age(){ return new Date().getFullYear()-1991; }, set age(val){ console.log('age can\'t be set to '+val); } }; man.age;//24 不能设置的只读属性
利用存取器,还可以实现数据对象与DOM对象的双向绑定。http://javascript.ruanyifeng.com/stdlib/object.html#toc3
属性标签
Object.getOwnPropertyDescriptor({pro : true}, 'pro');
//{value: true, writable: true, enumerable: true, configurable: true}
var person = {};
Object.defineProperty(person, 'name', {
configurable : false,//能否配置以及delete
writable : false,//只读
enumerable : true,//能否被for..in、Object.keys()、JSON.stringify()
value : "cbw"
});
person.name = 1;
person.name; // still cbw
delete person.name; // false
另外还有:
- Object.defineProperties():Object.defineProperty()升级版,定义多个属性。
- Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称(类似于Object.keys()但无视enumerable)。
继承自Object的方法
除了Object对象本身的方法,还有不少方法是部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法。
Object实例对象的方法,主要有以下六个。
- valueOf():返回当前对象对应的值。
- toString():返回当前对象对应的字符串形式。
- toLocalString():返回当前对象对应的本地字符串形式。
- hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
- isPrototypeOf():判断当前对象是否为另一个对象的原型。
- propertyIsEnumerable():判断某个属性是否可枚举。
控制对象状态
JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。
- Object.preventExtensions方法可以使得一个对象无法再添加新的属性。
- Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。
- Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。一种解决方案是,把原型也冻结住。
原型链相关方法(ES5)
- Object.create():生成一个新对象,将参数作为对象的原型。
- Object.getPrototypeOf():获取对象的Prototype对象,obj.__proto__===Object.getProtoypeOf(obj)。
浙公网安备 33010602011771号