1

プロトタイプの機能をテストしようとすると、次の奇妙な結果が得られました。これが私の最初のテストです。

<script>
function Hello() {
}
var a = new Hello();

Hello.prototype.name = "Fred";
alert(a.name);
</script>

そして、これが2番目のものです:

<script>
function Hello() {
}
var a = new Hello();

Hello.prototype = {
        name : "Fred",
}
alert(a.name);
</script>

同じ意味なのに、なぜ最初のアラートが「フレッド」で、2番目のアラートが「未定義」であるのか理解できません。手伝ってくれませんか。ありがとうございました。

4

3 に答える 3

2

JavaScriptで関数を定義すると、その関数をコンストラクターとして使用する場合に備えて、インタープリターはprototypeその関数でオブジェクトを指す特別なプロパティを使用できるようにします。コンストラクターを使用して新しいオブジェクトを作成する場合、[[Prototype]]内部プロパティはこのオブジェクトを指します。

prototypeプロパティを新しいプロパティに置き換えると、その参照が置き換えられます。オブジェクトをインスタンス化した後でこれを行うと、オブジェクトが古くprototypeなっているように見えます(そのオブジェクトは、指している元のオブジェクトを指しています)。[[Prototype]]prototype

ソリューション

プロパティに直接新しいプロパティを割り当てるだけprototypeです。

var constructor = function() { };
constructor.prototype.someMethod = function() { };

拡張タイプ関数を使用して、既存のprototypeプロパティを新しいオブジェクトで拡張します(この例では、アンダースコアのextend()関数を使用しました)。

var constructor = function() { };
_.extend(constructor.prototype, { someMethod: function() { } });

prototypeコンストラクターの後で、プロパティの割り当てがプログラムの次のステップであることを確認してください(通常はお勧めしません)。

var constructor = function() { };
constructor.prototype = { someMethod: function() { } };
于 2012-10-16T10:34:19.193 に答える
1

あなたの注文はめちゃくちゃです。演算子を使用するに、オブジェクトをプロトタイプに割り当てる必要があります。new

function Hello() {
}

Hello.prototype = {
        name : "Fred",
}

var a = new Hello();
alert(a.name);​

デモ。

于 2012-10-16T10:34:19.393 に答える
0

2つのコードスニペットは実際には等しくありません。

最初のスクリプトHello.prototype.nameでは、をオーバーライドするだけですが、2番目のスクリプトでは、のコンテンツ全体をオーバーライドしますHello.prototype

于 2012-10-16T10:34:05.170 に答える