12

クラスがある場合:

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'

私が持っている議論の1つは、次instanceofを使用する場合extendsです。

class BigHaha extends Haha

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

しかし、JavaScript演算子であることは、どれほど安全かということです。私はそれについて懐疑的である必要があると感じています。

一方、constructor.name何が起こっているのかは非常に明確です。constructor.nameすべてのオブジェクトに設定されることが保証されていますか?

情報をありがとう。

4

1 に答える 1

17

まず第一に、constructorストレートJavaScriptでもあります:

インスタンスのプロトタイプを作成したObject関数への参照を返します。

つまりo.constructor、あなたが本当にまっすぐなJavaScriptを実行していると言うときconstructor、CoffeeScriptオブジェクト初期化関数の名前は別の問題です。

これで、JavaScriptのconstructorプロパティを使用するかJavaScriptのinstanceof演算子を使用するかを選択できます。一方constructor、オブジェクトを作成するために使用された「クラス」は次のようになります。instanceof

[...]オブジェクトがそのプロトタイプチェーンにprototypeコンストラクターのプロパティを持っているかどうかをテストします。

したがってinstanceof、サブクラス化を許可する場合は正しい選択です。

于 2012-07-27T15:52:22.480 に答える