测试Backbone扩展构造函数的继承的好方法是什么?

时间:2013-03-16 08:32:12

标签: javascript backbone.js

如何测试构造函数是否扩展了另一个构造函数Backbone.js-style,其中继承是通过Backbone的extend方法设置的?并且不要说instanceof :)。我不是在谈论对象。我在谈论建设者。

例如:采用类似下面代码生成的构造函数:

var MyRouter = Backbone.Router.extend();

现在,在代码中的另一个位置,如何测试其原型链中的某个位置,var my_router = new MyRouter具有Backbone.Router.prototype的属性?

1 个答案:

答案 0 :(得分:0)

这是我的解决方案:

var inherits = function(child, parent) {
  if (!_.isFunction(child) || !_.isFunction(parent)) 
    throw new Error('`child` and `parent` must be functions.'); 

  return _.reduce(Object.getPrototypeOf(child.prototype), function(memo,  child_prototype__proto__) {    
    return _.contains(parent.prototype, child_prototype__proto__) && memo;
  }, true);
}

所以,你可以这样做:

var MyRouter = Backbone.Router.extend();
inherits(MyRouter, Backbone.Router) // true
inherits(MyRouter, Backbone.Model) // false

这适用于单层骨干式继承,其中Backbone的extend功能如上所述。

可行,因为Backbone的extend在设置原型链时执行以下操作,其中child是最后得到的构造函数,而parent是构造函数。延伸:

var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;

因此,由extend生成的构造函数在其.prototype.__proto__属性上具有其所有父级的原型属性。如果这是新的或令人困惑的,您可以在John Resig's blog上阅读更多相关信息。基本上,"test".__proto__ === String.prototype