繁体   English   中英

如何在ECMAScript 5中配置属性:Object.create或Object.defineProperties?

[英]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.createnew行为不同且它们的性能差异无关紧要,因此将它们与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 FooObject.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM