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

时间:2013-05-23 13:48:21

标签: javascript ecmascript-5

在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()定义属性是否有性能损失,如第一个示例中所示?这两个是等价的吗?是否就可读性达成了共识?

1 个答案:

答案 0 :(得分:2)

  

使用Object.defineProperties()

定义属性会受到性能影响

是。属性描述符未作为普通属性进行优化,因此速度要慢得多。如果您(必须)使用它们,您无论如何都不关心性能。将Object.createnew进行比较,由于他们的行为不同以及他们的表现差异无关紧要,因此毫无意义。

  

两者是否相同?

没有

// 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);