10

从节点 repl:

foo = { bar: 'baz'};
console.log (Object.getOwnPropertyDescriptor(foo, 'bar'))

返回值:

{ value: 'baz',
  writable: true,
  enumerable: true,
  configurable: true }

如何将可写可枚举和可配置更改为 false?这些值叫什么?它们是 ES5.1 的一部分吗?repl 没有输出的还有更多吗?

4

3 回答 3

17

“如何将可写可枚举和可配置更改为 false?”

Object.defineProperty(foo, 'baz', {
    enumerable:false,
    writable:false,
    configurable:false
});

还有Object.defineProperties, 是一样的,只是你可以设置多个属性, 和Object.create,它可以让你创建一个新对象,并设置它的原型对象和它的描述符。

“这些值叫什么?”

它们是属性描述符。

“它们是 ES5.1 的一部分吗?”

是的,ES5。

还有其他repl没有输出的吗?”

更多什么,属性描述符?不。

于 2012-07-01T02:46:35.567 回答
3

squint:我认为您的回答中有一点打字错误。

你的代码:

Object.defineProperty(foo, 'baz', {
enumerable:false,
writable:false,
configurable:false
});

但第二个参数必须是属性的名称而不是值,所以正确的代码是:

Object.defineProperty(foo, 'bar', {
enumerable:false,
writable:false,
configurable:false
});
于 2013-12-11T16:52:15.210 回答
0

只是想添加这个

您可以在第一次创建对象时更改属性,如下所示:

var newObj = Object.defineProperty({}, 'aPropertyName', {
    enumerable:false,
    writable:false,
    configurable:false
});

您也可以一次更改多个属性:

var newObj = Object.defineProperties({}, {
    aPropertyName: {enumerable: false, writable: false, configurable: false},
    anotherPropertyName: {enumerable: true, writable: true, configurable: false},
    finalPropertyName: {enumerable: true, writable: false, configurable: true},
});

当然,使用前面的方法传入对象名称:

Object.defineProperties(objectName, {
    aPropertyName: {enumerable: false, writable: false, configurable: false},
    anotherPropertyName: {enumerable: true, writable: true, configurable: false},
    finalPropertyName: {enumerable: true, writable: false, configurable: true},
});
于 2014-12-11T20:58:09.883 回答