我知道ECMAScript5有两种创建对象的方法。
1 /文字表示法(默认情况下)将所有内部数据属性设置为true(可写,可配置和可枚举。
2 /使用Object.create方法(默认情况下)将所有数据描述符设置为false。
在文字表示法中将enumerable设置为false是否有效?在object2上执行此操作时,对象.key(obj2)是否应该返回一个空数组?
var obj1 = Object.create(null, {
'name': {value: 'first object name'},
'surename': {value: 'first object surname', enumerable: true, configurable: true}
});
var obj2 = {'x': {value: 10, enumerable: false}};
console.log(Object.keys(obj1)); // ["surename"]
console.log(Object.keys(obj2)); // ["x"]
JsFiddle link
答案 0 :(得分:3)
我也为此搜索过,而且找不到任何东西。你可以 来定义getter和setter函数,如果你需要的话,就像这样:
var x = {
y: 6,
get foo() {
return this.y + 10;
},
set bar(value) {
this.y = foo - 1;
}
};
x.y; // 6
x.foo; // 16
x.bar = 8;
x.y; // 7
x.foo; // 17
我还定义了一个小实用程序,以便于用文字符号定义属性。这是:
/*
* Facilitates defining properties with advanced attributes in literal notation.
*
* Example:
* var foo = {
* x: 6,
* bar: new Property({
* enumerable: false,
* get: function () {
* return this.x + 1
* }
* })
* }
* foo.bar // value is an object of type Property
* Properties.eval(foo)
* foo.bar // value is now 7
*/
'use strict'
/**
* Constructor.
*
* @param {object} descriptor
* the property descriptor, in the format used by <code>Object.defineProperty</code>
*
* @returns {Property}
*
* @see Object.defineProperty
*/
var Property = function (descriptor) {
this.descriptor = descriptor
Object.freeze(this)
}
Property.prototype.toString = function () {
return 'Property'
}
var Properties = new Object(null)
/**
* Replace all properties of type <code>Property</code> contained in the
* specified object with the value associated with the <code>Property</code>.
*
* @param {object} object
* the object
*/
Properties.eval = function (object) {
// recursive
for (var propertyName in object) {
if (object.hasOwnProperty(propertyName)) {
var property = object[propertyName]
if (property instanceof Property) {
Object.defineProperty(object, propertyName, property.descriptor)
property = object[propertyName]
}
if (property instanceof Object) {
Properties.eval(property)
}
}
}
}
答案 1 :(得分:2)
Essentialy,这一行:
var obj2 = {'x': {value: 10, enumerable: false}};
您声明变量obj2
,这是一个具有一个属性x
的对象,该值是一个具有两个属性的对象:value
和enumerable
。 Object.create()
是函数,它只使用文字符号来定义正在构造的对象的属性。
答案 2 :(得分:2)
在文字表示法中将enumerable设置为false是否有效?在
object2
上执行此操作时,不应该Object.keys(obj2)
返回一个空数组吗?
取决于你的意思&#34;有效&#34;。正确的答案是不可能(至少在ES5中),所以你只需要定义一个具有两个属性的对象,每个属性都有一个对象作为值。
只需查看obj.x
。