在“mixins”一章中,有一个示例代码
function mixin(receiver, supplier) {
for (var property in supplier) {
if (supplier.hasOwnProperty(property)) {
receiver[property] = supplier[property]
}
}
return receiver;
}
function EventTarget(){
}
EventTarget.prototype = {
add: function(){console.log("add");}
};
function Person(name) {
this.name = name;
}
mixin(Person.prototype, new EventTarget());
mixin(Person.prototype, {
constructor: Person,
sayName: function() {
console.log(this.name);
this.fire({ type: "namesaid", name: name });
}
});
var person = new Person("Nicholas");
据我了解,这是试图将EventTarget.prototype中的属性复制到Person.prototype中。所以代码:
mixin(Person.prototype, new EventTarget());
应该是
mixin(Person.prototype, EventTarget.prototype);
我对这段代码是对的吗?
答案 0 :(得分:3)
是的,这可能是一个错误。
(自定义)EventTarget
构造函数定义为
function EventTarget(){
// No property assigned to `this`
}
EventTarget.prototype = {
add: function(){console.log("add");}
};
因此,EventTarget
实例将从add
继承EventTarget.prototype
方法,但不会拥有任何属性。
但是,函数mixin
仅分配自己的属性:
function mixin(receiver, supplier) {
for (var property in supplier)
if (supplier.hasOwnProperty(property)) // <--
receiver[property] = supplier[property]
return receiver;
}
因此,以下代码不执行任何操作
mixin(Person.prototype, new EventTarget());
答案 1 :(得分:0)
根据作者Nicholas Zakas的说法,是的,这确实是一个错误,应该是:
mixin(Person.prototype, EventTarget.prototype);
他在Google Groups thread上说了这个。