这个mixins代码是一本书的错误"面向对象JavaScript的原理"

时间:2015-02-07 00:27:50

标签: javascript

在“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);

我对这段代码是对的吗?

2 个答案:

答案 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上说了这个。