Javascript 1.9.3 / ECMAScript 5引入了Object。这是Douglas Crockford等人长期以来一直倡导的。我如何在下面的代码替换新的对象。创建?
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。创建创建用户“bob”?
我认为问题的重点是理解new和Object之间的区别。创建方法。根据这个答案和这个视频,new关键字做了下面的事情:
创建新对象。
将新对象链接到构造函数(原型)。
使此变量指向新对象。
使用new对象执行构造函数,隐式执行返回this;
将构造函数函数名赋给新对象的属性构造函数。
对象。Create只执行第1和第2步!
在代码示例中提供的问题,这不是什么大问题,但在下一个例子中,它是:
var onlineUsers = [];
function SiteMember(name) {
this.name = name;
onlineUsers.push(name);
}
SiteMember.prototype.getName = function() {
return this.name;
}
function Guest(name) {
SiteMember.call(this, name);
}
Guest.prototype = new SiteMember();
var g = new Guest('James');
console.log(onlineUsers);
作为副作用的结果将是:
[ undefined, 'James' ]
因为盖斯特。prototype = new SiteMember();
但是我们不需要执行父构造函数方法,我们只需要使方法getName在Guest中可用。
因此我们必须使用Object.create。
如果替换Guest。prototype = new SiteMember();
来的客人。prototype = Object.create(sitember .prototype);结果是:
[ 'James' ]