2014-08-27 84 views
1

因此,假設我在骨幹類:確定是否JavaScript類擴展了另一個類

var MyModel = Backbone.Model.extend({}); 

使用instanceof運算符,我可以檢查一個實例化對象是否延長的對象:

var instModel = new MyModel(); 
instModel instanceof MyModel; // true 
instModel instanceof Backbone.Model; // true 

我d喜歡能夠在不實例化對象的情況下檢查繼承。在JavaScript或Backbone中是否有一種方法來確定未被實例化的類是否擴展了對象?因爲:

MyModel instanceof Backbone.Model; // false 
MyModel instanceof Function; // true 

回答

3

可以使用的instanceof這樣的:

MyModel.prototype instanceof Backbone.Model 

這工作,因爲同時MyModel有沒有實例化的情況下,你真的不關心它,你在乎它的原型鏈,所以你可以只檢查它的原型繼承。

注意,這不會爲

MyModel.prototype instanceof MyModel 

具體檢查根據您的使用情況這可能是做工精細,但你想要的工作,你有兩個選擇:

MyModel === MyModel && MyModel.prototype instanceof MyModel 

// OR 

Object.create(MyModel.prototype) instanceof MyModel 
+0

好的解決方案。我知道這一定很簡單。爲了澄清未來的讀者,這忽略了一個大案例。 'MyModel.prototype instanceof MyModel'會失敗。所以一個健壯的生產檢查看起來像'(testModel!== ClassToCheck)&&(testModel.prototype instanceof ClassToCheck)' – stakolee 2014-08-27 17:20:34

+0

@stakolee真的!我想添加一個關於該選項的註釋並選擇不要,但是自從您提到它以來,我已經用兩個選項更新了答案。 – loganfsmyth 2014-08-27 20:40:29

0

你可以嘗試

Backbone.Model.prototype.isPrototypeOf(MyModel) 

我不熟悉骨幹的繼承模式,但instanceof會認爲Backbone.Model是一個經典的JavaScript構造,並檢查使用它的原型。 isPrototypeOf的優點是你可以直接指定原型而不是通過構造函數間接指定原型。

+0

看起來像這樣應該是我需要的,只需要在我的實際代碼中多加一點就可以了 – stakolee 2014-08-27 14:04:21

+0

實際上,我猜Backbone必須以自己特定的方式執行繼承,繞過一個被PutrotOf捕獲的情況。上面的例子在我的測試中不起作用。 – stakolee 2014-08-27 14:21:00

+1

它應該是'.isPrototypeOf(MyModel.prototype)'。 – loganfsmyth 2014-08-27 16:59:10

相關問題