[英]How to configure properties in ECMAScript 5: Object.create or Object.defineProperties?
在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()
定义属性是否Object.defineProperties()
性能产生影响? 这两个相等吗? 关于可读性是否达成共识?
使用
Object.defineProperties()
定义属性是否Object.defineProperties()
性能产生影响
是。 属性描述符没有作为普通属性进行优化,因此速度较慢。 如果您(必须)使用它们,则无论如何您都不在乎性能。 由于Object.create
与new
行为不同且它们的性能差异无关紧要,因此将它们与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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.