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

What is a good way to test for inheritance of Backbone-extended constructors?

本文关键字:方法 是什么 继承 扩展 构造函数 测试      更新时间:2023-09-26

如何测试一个构造函数是否扩展了另一个构造函数,Backbone.js风格,其中继承是通过Backbone的extend方法设置的?不要说instanceof:)。我说的不是物体。我说的是构造函数

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

var MyRouter = Backbone.Router.extend();

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

我的解决方案是:

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函数如上所述。

之所以有效,是因为Backbone的extend在建立原型链时执行以下操作,其中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 .