在 ECMAScript 5 中,与对象的属性有关的方法有这些:Object.prototype.hasOwnProperty,Object.defineProperty,Object.defineProperties,Object.getOwnPropertyNames 和 Object.getOwnPropertyDescriptor。除了第一个在 ECMAScript 3 中就已经出现,其它的都是新增的方法。
Object.prototype.hasOwnProperty 方法用于检测某个属性是对象自己的,还是从原型中继承来的。例如:
o = {abc: 123}; console.log(o.hasOwnProperty('abc')); // true console.log(o.hasOwnProperty('toString')); // false
Object.defineProperty 用于对增加或者修改某个对象的属性,并且可以设置更多的控制选项。例如:
o = {}; Object.defineProperty(o, 'abc', { value: 123, writable: false, enumerable: true, configurable: false }); o.abc = 456; delete o.abc; console.log(o.abc); // 123
其中 value 选项指明该属性 abc 的值,writable 选项指明该属性的值是否可以修改,enumerable 选项设置该属性是否在 for (key in o) {} 循环中列出。而 configurable 选项设置为 false 时该属性不可以删除,而且 enumerable 和 configurable 这两个选项也不可以修改,而 writable 选项只能从 true 改为 false。后面三个选项的默认值都是 false。
Object.defineProperties 和 Object.defineProperty 类似,只是它可以同时定义或修改多个属性。例如:
var o = {}; Object.defineProperties(o, { "abc": { value: 123, writable: true }, "uvw": { value: "test", writable: false } });
Object.getOwnPropertyNames 方法用于列出对象的所有自带属性的名称,并作为一个数组返回。例如:
var obj = { 'abc': 10, 'opq': 100, 'uvw': 1000}; console.log(Object.getOwnPropertyNames(obj)); // ["abc", "opq", "uvw"]
Object.getOwnPropertyDescriptor 方法用于列出对象的某个属性的各个选项。例如:
o = {}; Object.defineProperty(o, 'abc', { value: 123, writable: false, enumerable: true, configurable: false }); console.log(Object.getOwnPropertyDescriptor(o, 'abc')); // Object {value: 123, writable: false, enumerable: true, configurable: false}
后面这四个 ECMAScript 5 的方法在 IE9,Firefox 4,Safari 5,Chrome 5,Opera 12 中都可以使用。
参考资料:
[1] ECMAScript 5 compatibility table
[2] hasOwnProperty - JavaScript | MDN
[3] John Resig - ECMAScript 5 Objects and Properties
[4] Object.defineProperty - JavaScript | MDN
[5] Object.defineProperty Function (JavaScript) - MSDN
[6] defineProperties - JavaScript | MDN
[7] getOwnPropertyNames - JavaScript | MDN
[8] Object.getOwnPropertyDescriptor - JavaScript | MDN