如何在ECMAScript 5: Object中配置属性.创建或定义对象属性

How to configure properties in ECMAScript 5: Object.create or Object.defineProperties?

本文关键字:属性 配置 创建 对象 定义 Object ECMAScript      更新时间:2023-09-26

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

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

使用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 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);