2013-03-16 65 views
0

如何測試構造函數是否擴展了另一個構造函數Backbone.js-style,其中通過Backbone的extend方法設置繼承?並且不要說instanceof :)。我不是在談論物體。我在談論構造函數。什麼是測試Backbone擴展構造函數繼承的好方法?

例如:以構造像由以下代碼製作的一個:現在

var MyRouter = Backbone.Router.extend(); 

,在代碼中的另一個點,你怎麼可以測試它的原型鏈的某個地方,var my_router = new MyRouter具有的特性Backbone.Router.prototype

+0

我唯一的評論是:爲什麼?你爲什麼需要這個? – 2013-03-16 17:06:19

+0

@alexanderb:我想要這個測試。具體來說,在我的情況下,我有'繼承''綁定到'PR.test.utils.inherits',和: '好吧(PR.test.utils.inherits(PR.Router,Backbone.Router)''at PR.Router Backbone-extends Backbone.Router。');' – 2013-03-16 17:25:30

+0

它是愚蠢/太多? – 2013-03-16 17:30:03

回答

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 

這適用於單層骨幹風格的繼承,其中骨幹extend功能作爲以上。

的作品,因爲,因爲骨幹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

+1

主幹設置了一個可能有用的內部'__super__'屬性:http://jsfiddle.net/ambiguous/uTGrf/。 '__super__'雖然沒有記錄。 – 2013-03-16 19:09:11