1

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

除了使用newvs实例化的优点之外Object.create,使用 定义属性是否会影响性能Object.defineProperties(),就像第一个示例中一样?两者是等价的吗?对可读性有共识吗?

4

1 回答 1

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);
于 2013-05-23T20:55:47.730 回答