2

クラス定数を作成しようとしていますが、JavaScriptの初心者レベルの理解が示されていると思います。このコードが実行されるとき:

var Class = function() {};
Class.prototype = { CONST : 1 };
var instance = new Class(),
c1 = instance.CONST,
c2 = Class.CONST;

結果はそれとc1 === 1ですc2 === undefined。なぜそうではないのc2 === 1ですか?JavaScriptはプロトタイプチェーンを検索しませんClassか?

4

4 に答える 4

4

あなたがやろうとしているのは、他の言語ではクラス静的メソッドと呼ばれるものです。
Javascriptでそれを行うには、次のように書く必要があります

Class.CONST = 1; その後、あなたはそれを呼び出すことができますClass.CONST;

のようなインスタンスメソッドでアクセスしようとするとnew Class().CONST、未定義になります

質問に戻りますが、Class.prototypeのすべてには、newClass自体ではなく、オブジェクトのインスタンス(つまり、を介して作成されたもの)にのみアクセスできます。なんで?

の実装を検討してくださいnew

Function.method('new', function () {
    var that = Object.create(this.prototype);
    var other = this.apply(that, arguments);
    return (typeof other === 'object' && other) || that;
});

最初に、 uがを介して宣言したObject.create(this.prototype)ものを継承した新しいオブジェクトを作成し、次に、を呼び出します。これは、変数として使用して、宣言されたClass関数を呼び出すだけです。次に、オブジェクトを返します。Class関数は、を介して作成された新しく生まれたオブジェクトに物事を詰め込む方法として単に使用されていることがわかります。作成されたオブジェクトのみがプロトタイプメソッドにアクセスできます。this.prototypeClass.prototype = { Const : 1 }this.apply(that, arguments)thatthisnew

于 2012-08-30T02:47:37.043 に答える
2

CONSTコンストラクターのプロパティにアクセスしようとしています( Class = function(){})。CONSTインスタンス化するまで利用できませんClass

これに関するいくつかの良いリンク:

于 2012-08-30T02:21:45.743 に答える
1

簡単な答えは、インスタンスはコンストラクターのパブリックプロトタイプから継承するためc1CONSTプロパティはfromから継承されるということですClass.prototype(厳密には、インスタンスのプライベート[[Prototype]]プロパティです)。

一方、ClassはのインスタンスでFunctionあるため、ではなくから継承しますFunction.prototype(つまり、プライベート[[Prototype]]Function.prototype) 。したがって、プロパティClass.prototypeはありません。CONST

オブジェクトの値は、[[Prototype]]構築時に設定され、変更することはできません。Class.prototype他のオブジェクトに置き換えると、新しいインスタンスにのみ影響します。

一部の古いMozillaブラウザ(Firefoxなど)には__proto__、オブジェクトを参照して[[Prototype]]設定できるプロパティがありましたが、現在は非推奨になっていることに注意してください。

一般に、JavaScriptに関しては、ある程度エミュレートできる動作と機能を推測するため、クラスの観点から話さないのが最善です。

于 2012-08-30T04:29:16.097 に答える
0

Class関数オブジェクトです。CONST関数オブジェクトにはプロパティがありません。'Class'オブジェクトを作成するために使用されます。CONST「クラス」オブジェクトは、コンストラクターで宣言されているため、プロパティを持つカスタムオブジェクトです。

于 2012-08-30T02:31:27.543 に答える