0

通过查看 BackboneJS 的代码,我对扩展实现感兴趣。当我尝试自己制作时,我被卡住了。我的代码如下。

var extend = function(child) {
  var base = this;

  if(child) {
    for(var prop in child)  {
      base[prop] = child[prop];
    }
  }

  return base;
};

var Test = Mod.Test = function()  {
  this.data = {};
}

Test.prototype.set = function(key, value) {
  this.data[key] = value;
}

Test.prototype.get = function(key)  {
  return this.data[key];
}

Test.extend = extend;

当我这样尝试时,我无法将 hello 方法附加到 Mod.Test

var testObj = new Mod.Test.extend({
 hello : function() {
  console.log('hello');
 }
});

这怎么可能。它是如何在backbonejs中实现的。

4

1 回答 1

2

Backbone 的 extend 方法接受两个参数——实例属性和静态属性。第一个被复制到正在创建的实例,第二个被分配给实例的原型。通常您应该在没有 new 运算符的情况下调用 extend 方法,但在这种情况下,这是您的代码的工作版本:

var extend = function(child) {
  var base = this;

  if(child) {
    for(var prop in child)  {
      base[prop] = child[prop];
    }

    for(var prop in child)  {
      base.prototype[prop] = child[prop];
    }
  }



  return base;
};

var Test = Backbone.Model.Test = function()  {
  this.data = {};
}

Test.prototype.set = function(key, value) {
  this.data[key] = value;
}

Test.prototype.get = function(key)  {
  return this.data[key];
}

Test.extend = extend;

进而:

Test = Backbone.Model.Test.extend({
  hello : function() {
    console.log('hello');
  }
});
var testObj = new Test;
于 2013-03-06T19:28:49.413 回答