正文
Object.getOwnPropertyNames(Object.prototype)
Object.keys 返回一个对象的实例可枚举属性, 如果使用了Object.defineProperty改变了对象的某个属性, 则无法通过Object.keys返回属性进行遍历属性, 也无法使用 for-in循环。
var obj = {
foo: function () {}
};
// return ['foo']
Object.keys(obj);
Object.defineProperty(obj, 'foo', {
enumerable: false
});
// return []
Object.keys(obj);
// empty loop
for (var name in obj) {
console.log(name);
}
// return false
obj.hasOwnProperty('foo');
Object.getOwnPropertyNames() 返回自身实例属性名称, 无视enumerable: false
var obj = {
foo: function () {},
bar: 'hello world'
};
Object.defineProperty(obj, 'foo', {
// foo 已被定义, 所以需要显示设置 false
enumerable: false
});
Object.defineProperty(obj, 'foo2', {
value: function () {},
// foo2 未被定义, 默认enumerable为false
enumerable: true
});
// 'bar', 'foo2'
Object.keys(obj);
// 'foo', 'bar', 'foo2'
Object.getOwnPropertyNames(obj);
'foo' in obj // return true
in 操作符, 检查属性是否在能够获取, 无视属性
对象定义属性
属性描述一般是由enumrable, value, get, set, configurable, writeable, value 组成, 其中 get, set 与 value 为互斥关系
定义一个对象的描述
var obj = Object.create(null);
Object.defineProperty(obj, 'foo', {
value: 'foo',
configurable: false,
writeable: false,
enumerable: false
});
obj.foo = 'change foo';
console.log(obj.foo); // still foo
Object.defineProperty(obj, 'foo', {
writeable: true,
configurable: true
});
obj.foo = 'change foo 2';
console.log(obj.foo); // still foo
'foo' in obj; // return true
-
一旦被定义了configureable: false, 那么后续再次 defineProperty时不会生效。
-
writeable: false 的情况下, 无法修改属性的 value 值
属性描述中的 value 与 get, set
var obj = Object.create(null);
// throw Error
// Uncaught TypeError: Invalid property descriptor.
// Cannot both specify accessors and a value or writable attribute
Object.defineProperty(obj, 'foo', {
value: 'foo',
set: function (val) {
// this 指向 obj
this._foo = val;
},
get: function () {
return this._foo;
}
});
因为 value 与 get, set 为互斥关系, 所以无法同时进行定义。
writeable 与 get, set
var obj = Object.create(null);
Object.defineProperty(obj, 'foo', {
// 失效
writeable: false,
set: function (val) {
// this 指向 obj