4
var a = function () {};
a.prototype.test  = function () {
alert("hello");
} 

正常に動作しますが、次のコードでは

var b = new Object();
b.prototype.test  = function () {
alert("hello");
} 

このエラーが発生しています TypeError: Cannot set property 'test' of undefined で、取得できません。

私の理解によると、 b はObjectからプロトタイプ オブジェクトを継承しています。したがって、 b.prototype.x = 1 と言う方法で新しいプロパティを追加できるはずです。

しかしObject .prototype.x = 1 は機能します。

typeof Objectで a は関数を与えますが、b の関数は object です

b.prototype.x = 1 が機能しない理由がわかりません

ありがとう。

4

4 に答える 4

2

これはトリッキーな問題です。プロトタイプフィールドには、内部フィールドと外部フィールドの2種類があります。あなたがしているようにあなたが通常のプロトタイプフィールドで直接アクセスできる外部のもの。内部のものは、フィールド/キーがオブジェクトに見つからない場合にルックアップを実行するために使用されます。

を実行するとnew blah()、内部プロトタイプフィールドがの外部プロトタイプフィールドに設定された新しいオブジェクトが作成されますblah。デフォルトでは、新しく構築されたオブジェクトの外部プロトタイプフィールドはですundefined。特に、これがb.prototype.xの評価が失敗する理由です。未定義の値に対してフィールドアクセスを行うことはできません。必要に応じて、新しい外部プロトタイプ用の新しいオブジェクトを作成できますb = new Object(); b.prototype = {}

ここで、動作中の内部/外部プロトタイプフィールドを確認できます。

Object.prototype.x = 4
b = new Object()
b.x // returns 4

何が起こったのかというと、bの内部プロトタイプフィールドがObject.prototypeを指しているため、失敗したbへのルックアップは、Object.prototypeでルックアップを実行するようにリダイレクトされます。

理由はわかりませんが、新しく作成された関数は、外部プロトタイプフィールドをオブジェクトに設定します。これにより、最初の関数が機能します。

于 2012-07-28T20:07:59.377 に答える
2

Objectprototypeプロパティを持つ関数です。

new Object()プロパティを持たないオブジェクトを作成しprototypeます。


オブジェクトのプロトタイプを設定する場合は、オブジェクトのコンストラクターのプロトタイプを設定することを意味する場合があります。

b.constructor.prototype.test = ...

プロトタイプ/コンストラクターのナンセンスのいくつかを明確にするために:

関数にprototypeは、オブジェクトである があります。その関数のインスタンスに追加するプロパティを指定します。

オブジェクトにはconstructor関数である があります。オブジェクトの作成に使用された関数を指定します。

関数はオブジェクトなので、 もあることに注意してconstructorくださいFunction

于 2012-07-28T20:03:02.420 に答える
1

You can refer to this resource

It doesn't work for the new object because it doesn't have a prototype property set. prototype property points to the Object that you have inherited. And since new Object() has had no object to inherit from, its prototype is set to undefined

A function on the other hand, has a super object (it inherited) by default.

于 2012-07-28T19:39:40.743 に答える
0

次のようにできるはずです。

var b = {};
b.test = function() {
    alert('Hello');
};
于 2012-07-28T19:34:11.830 に答える