2012-07-27 49 views
12

如果我有一個類:的CoffeeScript:使用的instanceof VS Class.constructor.name

class Haha 
    constructor: (@lolAmount = 1) -> 
    alert @lolAmount 

我想檢查的對象是正確類的,是否總是安全使用constructor.name

haha = new Haha() 
unless haha.constructor.name is 'Haha' 
    throw Error 'Wrong type' 

或者是它更好地使用instanceof

haha = new Haha() 
unless haha instanceof Haha 
    throw Error 'Wrong type' 

有一種說法我有爲instanceof使用extends當是:

class BigHaha extends Haha 

bigHaha = new BigHaha 
console.log bigHaha instanceof Haha #true 

但如何安全是它,是一個JavaScript運營商 - 我覺得我應該是懷疑它。

另一方面,與constructor.name很清楚發生了什麼。是否保證constructor.name將在所有對象上設置?

感謝您的任何信息。

回答

17

首先,constructor也是直的JavaScript:

返回到創建實例的原型對象函數的引用。

所以,當你說o.constructor,你真的做直接的JavaScript,爲CoffeeScript的對象初始化函數名稱constructor是另外一個問題。

因此,現在您可以選擇使用JavaScript的constructor媒體資源或JavaScript的instanceof運營商。該constructor只是告訴你什麼是「一流」來創建對象,instanceof在另一方面:

[...]測試對象是否在其原型鏈有一個構造函數的prototype財產。

所以instanceof是正確的選擇,如果你想允許子類化。

+0

非常感謝!只是爲了確認,構造函數的'name'屬性是CoffeeScript是嗎?對於那些我不關心子類/超類的類是可靠的嗎? – phenomnomnominal 2012-07-27 16:25:19

+0

@phenomnomnominal:['name'來自JavaScript的'Function'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name),並且是非標準的,所以它可能會也可能不會工作。使用'instanceof'或直接比較'constructor'函數。但是,真的,只需使用'instanceof'。 – 2012-07-27 16:37:33

+1

我記得有關'constructor.name'屬性被closure/uglifyjs破壞的coffeescript問題的討論。另一件值得了解的事情是'instanceof'只能用於你自己的對象,而不是內置類型。但我同意,對於這種使用,'instanceof'是更好的選擇。 *編輯:* [這裏是一個類似的討論](https://github.com/mishoo/UglifyJS/issues/290)。 – 2012-07-27 16:56:01