あなたが理解していないいくつかのこと:
- プロトタイプは、オブジェクトに固有のプロパティではありません。これは、それを作成するために使用される関数のプロパティです。
- この場合、オブジェクトリテラルを作成するものは、JavaScriptですべてを作成する際に果たす役割があります
任意のオブジェクトのコンストラクタープロパティからプロトタイプに直接アクセスでき、ほとんどの場合、少なくともプロパティを追加できます(ただし、通常、コアネイティブオブジェクトコンストラクターのプロトタイプ全体を置き換えることはできません)。オブジェクトリテラルの場合、次のようになります。
var obj = {};
//BIG NOTE: don't do this in real code. Just goof around in a console or a test project
obj.constructor.prototype.sayHi = function(){ console.log('HI'); }
var anotherObj = {};
anotherObj.sayHi(); //'HI'
それで、イェーイそうですか?しかし、ここに問題があります。これらも機能します:
'bob'.sayHi();
[].sayHi();
new Date().sayHi();
document.sayHi();
(6).sayHi();//have to put 6 in parens because it handles '.' differently
オブジェクトリテラルは、コアオブジェクトコンストラクター関数を使用して作成されます。オブジェクトコンストラクターには、JavaScriptで考えられるほぼすべてのことについて、プロトタイプチェーンの最初にプロトタイプとして使用される単純なインスタンスがあります。深刻な奇妙な問題が発生する可能性が高いため、prototype.js以降誰もこれを行っていません。
一般的に言って、プロトタイプでやりたいことは、別の方向で試みたほうがよいかもしれません。オブジェクトリテラルを新しい関数コンストラクターのプロトタイプとして設定します。そうすれば、ページ上のすべてのJSを爆破することなく、継承オプションを利用できます。
オブジェクトコンストラクターのプロトタイプをいじることは、一般的に非常に悪い考えと考えられています。Function.prototypeも避けたいものだと思います。他のネイティブコンストラクターのプロトタイプオブジェクトの構築に使用されないオブジェクトコンストラクターは、通常、プロトタイプ調整の公正なゲームと見なされるため、たとえば、古いIEで欠落している配列メソッドを追加するなどのことができます。