Javascript将对象传递给函数原型?

时间:2016-01-24 05:39:46

标签: javascript backbone.js

我试图通过创建自己的MVC库深入挖掘javascript。我正在研究backbone.js源代码https://github.com/jashkenas/backbone/blob/master/backbone.js

在backbone.js中定义集合时,您可以将其分配给javascript变量,如var AppCollection = Backbone.Collection.extend({ model: BACKBONE_MODEL })

创建者在内部使用下划线并将prototype的{​​{1}}传递给下划线的Collection方法,如_.extend(),其中空对象参数位于我的示例中写入是作者添加Collection对象的所有方法的地方,即_.extend(Collection.prototype, Events, {})键,其值是库中先前定义的Model对象。

我很好奇,我怎样才能避免下划线依赖并为Collection添加我自己的原型方法,具体来说我如何将带有键model的对象传入我自己的Collection对象?

这是我到目前为止所拥有的。

model

1 个答案:

答案 0 :(得分:2)

为了防止依赖“_”,您可以使用以下方法扩展对象或类而不是“_.extend()”。

您可以使用Object.assign扩展原型。这个问题是它并没有得到所有浏览器的完全支持(我正在看你的IE)。另一种选择是创建自己的扩展功能。您可以使用Object.keys(mixinClass)来执行此操作。

使用Object.assign:

function a() {
  this.propOne = "one";
}

a.prototype.methodOne = function() {
  document.write("<br/>I am methodOne from a");
}

function b() {
  this.propTwo = "two";
}

b.prototype.methodTwo = function() {
  document.write("<br/>I am methodTwo from b");
}

function assigned() {
  // Call both "super" constructors (order can matter depending on your case)
  a.call(this);
  b.call(this);
}

// Assign other object properties to your object and set constructor
Object.assign(assigned.prototype, a.prototype, b.prototype);
assigned.constructor = assigned;

var x = new assigned();
document.write("<pre>I am assigned and I look like: \n" + JSON.stringify(x, 2, null) + "</pre>");
x.methodOne();
x.methodTwo();

使用自定义扩展功能:

function myExtend() {
  var args = Array.prototype.slice.apply(arguments);
  var target = args.shift();
  var extended = {};
  args.forEach(function(o) {
    Object.keys(o).forEach(function(k) {
      extended[k] = o[k];
    });
  });
  Object.keys(extended).forEach(function(k) {
    if (!target[k])
      target[k] = extended[k];
  });
}

function a() {
  this.propOne = "one";
}

a.prototype.methodOne = function() {
  document.write("<br/>I am methodOne from a");
}

function b() {
  this.propTwo = "two";
}

b.prototype.methodTwo = function() {
  document.write("<br/>I am methodTwo from b");
}

function assigned() {
  a.call(this);
  b.call(this);
}

myExtend(assigned.prototype, a.prototype, b.prototype);
assigned.constructor = assigned;

var x = new assigned();
document.write("<pre>I used myExtend and I look like: \n" + JSON.stringify(x, 2, null) + "</pre>");
x.methodOne();
x.methodTwo();

这个概念是mixin的概念。您可以使用它来扩展简单对象或“混合”多个类,以创建具有多种类型方法的子类。不幸的是,这并不完全理想,因为对象实际上具有“超级”属性和方法的副本而不是使用引用。无论哪种方式,这应该适用于您的用例。