2009-10-20 13 views
46
STORE = { 
    item : function() { 
    } 
}; 
STORE.item.prototype.add = function() { alert('test 123'); }; 
STORE.item.add(); 

これはかなり間違っているのを解明しようとしています。なぜこれは機能しませんか?プロトタイプオブジェクトは、constructor functionsに新しいオブジェクトインスタンスを作成するために、new operatorを使用して呼び出される基本的な機能を使用することを意味しているJavaScriptオブジェクトにプロトタイプを追加するリテラル

STORE.item.prototype.add(); 

答えて

71

:私はフォローを使用する場合しかし、それは動作します。 JavaScriptで

機能は、あなたがそれらにメンバーを追加し、普通のオブジェクトのように扱うことができることを意味first-classオブジェクトです:あなたはインスタンス化したときに私が前に言ったように、プロトタイプオブジェクトの典型的な使用

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

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

、あります

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

var obj = new SomeObject(); 

それらのメンバーは目をアクセスされるので、SomeObjectのすべてのインスタンスは、SomeObject.prototypeからメンバーを継承します。たとえば、new演算子をコンストラクタ関数を呼び出すことによってオブジェクトプロトタイプチェーンのラフ。

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

+0

説明とリンクありがとうございました!今私にとってははるかに明確です。 :) – John

+0

ようこそ@ジョン、助けてうれしい! – CMS

+1

すばらしい説明!いいぞ!! –

2

JSONリバースを使用すると、解析時にJSONをクラスオブジェクトに変換できます。 ECMAScriptの5案はhttp://JSON.org/js.html

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

に記載JSON2のリバイバー方式を採用しており、オプションのリバイバーパラメータは 最終結果のすべてのレベルですべての キーと値のために呼び出される 関数です。各値は で、復習者 機能の結果に置き換えられます。これは、 汎用オブジェクトを 疑似クラスのインスタンスに改造したり、日付 文字列を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; 
}); 
+0

この情報を知っておくとよいでしょう。 +1。 myJSONtextと型の関数の詳細を使ったもう少し詳細な例は、さらに優れていましたが、とにかくこの情報をお寄せいただきありがとうございます。 –

9

は、JavaScript(ES2015が到着したが)私たちは、この書き込みの最後にObject.setPrototypeOf()方法

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

 

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

 

 
STORE.item.add();

1

を持っている場合、これは__proto__プロパティを使用することにより可能です。ちょうどその場合、現在誰かが現在チェックしているのかもしれません。

const dog = { 
    name: 'canine', 
    bark: function() { 
     console.log('woof woof!') 
    } 
} 

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

ただし、この場合には、プロトタイプを追加する推奨される方法はObject.createを使用しています。したがって、上記のコードは、に変換されます。

const pug = Object.create(dog) 

pug.bark(); 

かの答えの一つで述べたように、あなたもObject.setPrototypeOfを使用することができます。

希望に役立ちます。

関連する問題