0

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

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

var MyRouter = Backbone.Router.extend();

现在,在代码的另一个地方,你如何测试它的原型链中的某个地方var my_router = new MyRouter是否具有 的属性Backbone.Router.prototype

4

1 回答 1

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 风格的继承,其中 Backbone 的extend功能如上使用。

之所以有效,是因为 Backboneextend在设置原型链时会执行以下操作,child最后你得到的构造函数在哪里parent,你正在扩展的构造函数在哪里:

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

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

于 2013-03-16T08:32:11.700 回答