STORE = {
item : function() {
}
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();
私はかなり長い間、これの何が問題なのかを理解しようとしてきました。なぜこれが機能しないのですか?ただし、次を使用すると機能します。
STORE.item.prototype.add();
STORE = {
item : function() {
}
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();
私はかなり長い間、これの何が問題なのかを理解しようとしてきました。なぜこれが機能しないのですか?ただし、次を使用すると機能します。
STORE.item.prototype.add();
プロトタイプ オブジェクトは、基本的に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 のすべての関数にはプロトタイプ オブジェクトがあります。
長い年月を経て、JavaScript (ES2015 が登場) がついにObject.setPrototypeOf()メソッドになりました。
const STORE = {
item: function() {}
};
Object.setPrototypeOf(STORE.item, {
add: function() {
alert('test 123');
}
})
STORE.item.add();
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;
});