在ECMAScript 5中定义属性属性的首选方法是什么?据我所知,至少有两种方式:
function Foo () {
Object.defineProperties(this, {
'a': {
value: "A",
writable: false
},
'b': {
value: "B",
writable: true,
enumerable: true
}
});
}
var f = new Foo();
或者:
var Foo = Object.create({}, {
'a': {
value: "A",
writable: false
},
'b': {
value: "B",
writable: true,
enumerable: true
}
});
};
var f = Object.create(Foo);
除了使用new
vs Object.create
进行实例化的优点之外,使用Object.defineProperties()
定义属性是否有性能损失,如第一个示例中所示?这两个是等价的吗?是否就可读性达成了共识?
答案 0 :(得分:2)
使用
定义属性会受到性能影响Object.defineProperties()
是。属性描述符未作为普通属性进行优化,因此速度要慢得多。如果您(必须)使用它们,您无论如何都不关心性能。将Object.create
与new
进行比较,由于他们的行为不同以及他们的表现差异无关紧要,因此毫无意义。
两者是否相同?
没有
// The first one,
function Foo() {
Object.defineProperties(this, propertydescriptors);
}
f = new Foo;
// is equivalent to
function Foo() {}
f = Object.defineProperties(new Foo, propertydescriptors);
// as long as there is closure in the property descriptor
// The second one,
foo = Object.create({}, propertydescriptors);
// is equivalent to
foo = Object.defineProperties(Object.create({}), propertydescriptors);
和new Foo
与Object.create({})
不同 - 没有共同Foo.prototype
。另外,在你的第二个例子中你甚至还有
f = Object.create(foo);
现在明显不同于上面的f = new Foo
。
是否就可读性达成共识?
构造函数中的属性描述符非常罕见。如果您只需要它们,则没有理由不使用更简洁,更简洁的Object.create
语法。但是,如果你真的想从不是空对象的东西继承,你应该只使用Object.create
:
f = Object.create(fooproto, propertydescriptors);
如果没有,请使用
f = Object.defineProperties({}, propertydescriptors);