Javascript 1.9.3 / ECMAScript5引入了Object.createDouglasCrockford等人提倡很长时间的技术。如何new在下面的代码中替换为Object.create?
Object.create
new
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存在)。
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属性将发生变化。
userB
init
id
name
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.defineProperties和Object.defineProperty方法相似的语法,使用对象常量在属性的第二个参数上初始化属性。
Object.defineProperties
Object.defineProperty
它可以让你设置属性的属性(enumerable,writable,或configurable),它可以是非常有用的。
enumerable
writable
configurable