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

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”?

回答:

仅具有一个继承级别,您的示例可能无法让您看到的真正好处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),它可以是非常有用的。

以上是 使用“ Object.create”而不是“ new” 的全部内容, 来源链接: utcz.com/qa/401507.html

回到顶部