2016-03-26 2 views
1

CoffeeScriptのプロトタイプの継承、特に特定のオブジェクトを継承するCoffeeScriptクラスの作成方法については、 Crockfordのオブジェクト関数に似た別のクラスではなく、基本的には、コンストラクタに渡された特定のオブジェクトから継承できるクラスを書くことです。残念ながら、setPrototypeOfに頼ることなく、これは不可能かもしれないと私は信じています。代わりに私はおそらく同様のことをすることができる関数を解決しようとしています。今既存のオブジェクトを拡張するCoffeeScriptクラスのインスタンスをインスタンス化するユーティリティ関数

a = {foo: 1} 

class Example 
    constructor: (@bar) -> 

extendObject = (parent, Class, args...) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    new F args... 

extendObjectMaker = (parent, Class) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    F 

maker = extendObjectMaker a, Example 

test1 = extendObject a, Example, 2 
test2 = new maker 2 

私は非常にあなたがしてとの定期的なコンストラクタ構文を使用することができる新しいクラスで、それが戻っている、本質的にどのようなことから、第二のアプローチを好む、下記二つの可能性があります。 extendObjectを使用して作成されたオブジェクトはによって返されたコンストラクタを使用して作成されたオブジェクトはと正しく識別され、Fとして識別され、Exampleのインスタンスではありません。

console.log test1 instanceof Example # True 
console.log test2 instanceof Example # False 

これらの関数がほぼ完全に同じコードを使用しているとすれば、なぜ私が異なる動作を示しているのかを理解するのが難しいです。だから、なぜtest2Exampleとして表示されないのか、誰かがそれをするために変更する必要があるのか​​分かりますか?

+0

らしいです:) – Ven

+0

ええと、それはなぜでしょうか? – rmehlinger

+1

ああ、私はとてもすみません!モバイル上のStackoverflowは、別のスタック交換のWebサイトの配色を持っています! – Ven

答えて

2

コーヒースクリプトソースコードhttp://coffeescript.org/v1/annotated-source/nodes.html#section-60を見てください。

CoffeeScriptは、コンストラクター呼び出しがsplat(args...)で呼び出されるか、呼び出されないかによって異なります。

あなたはどちらか次のようにあなたの関数を再書き込みnew maker [2]...またはでextendObjectMakerを呼び出す場合は、望ましい結果が得られますあなたのコード:あなたは、このための右のウェブサイト上じゃないよう

extendObjectMaker = (parent, Class) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    (args...) -> new F args... 
+0

残念ながら、リンクは現在無効になっています –

+1

更新されました!これはCoffeeScript 1.xにのみ関連していることに注意してください。CoffeeScript 2がどのように異なるコンストラクタ呼び出しを扱うかは不明です。 –

関連する問題