一尘不染

使用“ Object.create”而不是“ new”

javascript

Javascript 1.9.3 / ECMAScript5引入了Object.createDouglasCrockford等人提倡很长时间的技术。如何new在下面的代码中替换为Object.create

var UserA = function(nameParam) {
    this.id = MY_GLOBAL.nextId();
    this.name = nameParam;
}
UserA.prototype.sayHello = function() {
    console.log('Hello '+ this.name);
}
var bob = new UserA('bob');
bob.sayHello();

(假设MY_GLOBAL.nextId存在)。

我能想到的最好的是:

var userB = {
    init: function(nameParam) {
        this.id = MY_GLOBAL.nextId();
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var bob = Object.create(userB);
bob.init('Bob');
bob.sayHello();

似乎没有任何优势,所以我想我没有。我可能太新古典了。我应该如何使用Object.create来创建用户“ bob”?


阅读 376

收藏
2020-04-25

共1个答案

一尘不染

仅具有一个继承级别,您的示例可能无法让您看到的真正好处Object.create

通过此方法,您可以轻松实现 差异继承 ,其中对象可以直接从其他对象继承。

在您的userB示例中,我认为您的init方法不应该是公共的,甚至不存在,如果您在现有对象实例上再次调用此方法,则idandname属性将发生变化。

Object.create 使您可以使用第二个参数来初始化对象属性,例如:

var userB = {
  sayHello: function() {
    console.log('Hello '+ this.name);
  }
};

var bob = Object.create(userB, {
  'id' : {
    value: MY_GLOBAL.nextId(),
    enumerable:true // writable:false, configurable(deletable):false by default
  },
  'name': {
    value: 'Bob',
    enumerable: true
  }
});

如您所见,可以Object.create使用与Object.definePropertiesObject.defineProperty方法相似的语法,使用对象常量在属性的第二个参数上初始化属性。

它可以让你设置属性的属性(enumerablewritable,或configurable),它可以是非常有用的。

2020-04-25