6

JavaScript では、なぜプロパティをコンストラクターに直接アタッチしたいのでしょうか?

var Human = function() {};
Human.specie = "Homo Sapience";

__extend次の行を含むCoffeeScript のヘルパー関数を見た後、この質問がありました。

for ( var key in parent ) { 
  if ( __hasProp.call( parent, key ) ) child[key] = parent[key]; 
} 

プロパティ/メソッドをコンストラクターオブジェクトから直接サブクラス化されたオブジェクトにコピーします。しかし、なぜ誰かがそれをするのでしょうか?

ありがとう!

4

3 に答える 3

2

(編集:元の形式では、プロパティをクラスにアタッチするか、プロパティをプロトタイプにアタッチするかについて質問されたので、それが私が回答しているものです。)

それは、何よりも慣例の問題です。あなたが書くなら

Human::specie = "Homo sapiens"

(ここHuman::specieで、CoffeeScript は の省略形Human.prototype.specie) を宣言しjane = new Human、次に(特に別のものに設定しない限り) にjane.specieなります。この場合、それは望ましいように聞こえます。"Homo sapiens"jane.specie

しかし、多数のプロトタイプ間でプロパティを共有すると、コードが理解しにくくなる場合もあります。オブジェクトを持つLoggerクラスがあるとしましょう。configそのオブジェクトをプロトタイプにアタッチすると、次のようなコードを記述できます。

log = new Logger
log.config.destination = './foo'

これにより、オブジェクトが 1 つしかないため、すべての Loggerインスタンスの宛先が に変更されます。すべてのインスタンスに適用する場合は、適切なクラスにアタッチして、上記のコードからあいまいさを取り除く必要があります。'./foo'configconfigLogger

log = new Logger
Logger.config.destination = './foo'
于 2011-06-29T17:11:17.123 に答える
1

ゲームで、ワールドというオブジェクトがあるとします。ただし、ゲーム内のワールドは 1 つだけです。これが、理論的にはこれを行う理由です。

于 2011-06-29T17:10:10.600 に答える
0

要するに、投稿された質問への答えは名前間隔です。プログラム全体で共有する意味があり、意味的に特定のクラスと関係がある特定の値があります。これらの関数と値は、いくつかの変数に入れることができますが、それらをコンストラクター関数にアタッチすると、それらに名前空間を付けることができます。

最良の例は JavaScriptMathクラスです (純粋主義者にとっては、これが実際にはクラスではなく、オブジェクトであることはわかっています)。

// There are constants
Math.E
Math.PI
Math.SQRT2
// And there are also methods
Math.ceil
Math.cos
Math.sin

したがって、メソッドと値 (定数に保存される) は常に同じであり、それらが呼び出されるインスタンスに依存せず、それらをインスタンスに持つことは意味がありません。

于 2011-10-25T16:23:47.537 に答える