58
STORE = {
   item : function() {
  }
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();

私はかなり長い間、これの何が問題なのかを理解しようとしてきました。なぜこれが機能しないのですか?ただし、次を使用すると機能します。

STORE.item.prototype.add();
4

5 に答える 5

89

プロトタイプ オブジェクトは、基本的にnew 演算子を使用して呼び出されて新しいオブジェクト インスタンスを作成する関数であるコンストラクター関数で使用することを意図しています。

JavaScript の関数はファースト クラスのオブジェクトです。つまり、関数にメンバーを追加して、通常のオブジェクトと同じように扱うことができます。

var STORE = {
   item : function() {
  }
};

STORE.item.add = function() { alert('test 123'); };
STORE.item.add();

前に述べたように、プロトタイプ オブジェクトの典型的な使用法は、new 演算子を使用してコンストラクター関数を呼び出してオブジェクトをインスタンス化する場合です。たとえば、次のようになります。

function SomeObject() {} // a constructor function
SomeObject.prototype.someMethod = function () {};

var obj = new SomeObject();

SomeObject のすべてのインスタンスは、 からメンバーを継承しますSomeObject.prototype。これは、これらのメンバーがプロトタイプ チェーンを介してアクセスされるためです。

どの関数がコンストラクターとして使用されることを意図しているかを知る方法がないため、JavaScript のすべての関数にはプロトタイプ オブジェクトがあります。

于 2009-10-20T04:15:24.407 に答える
18

長い年月を経て、JavaScript (ES2015 が登場) がついにObject.setPrototypeOf()メソッドになりました。

const STORE = {
  item: function() {}
};


Object.setPrototypeOf(STORE.item, {
  add: function() {
    alert('test 123');
  }
})


STORE.item.add();

于 2016-04-19T11:45:38.753 に答える
3

JSON リバイバーを使用して、解析時に JSON をクラス オブジェクトに変換できます。EcmaScript 5 ドラフトは、http://JSON.org/js.html で説明されている JSON2 リバイバー スキームを採用しています。

var myObject = JSON.parse(myJSONtext, reviver);

オプションの reviver パラメーターは、最終結果のすべてのレベルですべてのキーと値に対して呼び出される関数です。各値は、reviver 関数の結果に置き換えられます。これを使用して、汎用オブジェクトを疑似クラスのインスタンスに再形成したり、日付文字列を Date オブジェクトに変換したりできます。

myData = JSON.parse(text, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new (window[type])(value);
        }
    }
    return value;
});
于 2009-10-20T05:12:49.160 に答える