2017-07-12 6 views
4

Array.prototypeにゲッターを追加して、配列の最後の要素を取得したかったのです。Array.prototypeへのゲッターの追加

私はこのようにそれをやった:

Object.defineProperty(Array.prototype, 'last', { 
    get: function() { 
     return this[this.length - 1]; 
    } 
}); 

は、メモリのため、この正しいですか?私の心配はした場合、インスタンス10000個のオブジェクト:私はメモリにのみ1つの機能を持っていることを願っています

  • 私の心配は、私がメモリに10000 * 1 = 10000個の機能を持っているかもしれないということです

私の目標は、このようにそれを使用することです:

const arr = [{}, {}, {}, {}]; 
arr.last === arr[arr.length - 1]; 
+0

をあなたのソリューションは結構です、あなたは新しいプロパティを定義し、「最後」にArray.prototypeオブジェクトは、後で作成するすべての配列オブジェクトに適用されます。すべての配列に対して同じ1つのメソッドインスタンス。 – sidanmor

答えて

2

これは、それぞれのインスタンスのプロトタイプが同じオブジェクトを参照しています。 JavaScriptで

、それらがコピーされていない - の代わりに、リンクは、オブジェクト・インスタンスと(コンストラクタにprototypeプロパティから派生し、そのプロト性、)そのプロトタイプとの間に形成されている、およびプロパティプロトタイプのチェーンを歩いていくことでメソッドが見つかります。

プロトタイプでの作業について詳しく読む: MDN

あなたは簡単にこのテストすることができます。

Object.defineProperty(Array.prototype, 'last', { 
 
    get: function() { 
 
     return this[this.length - 1]; 
 
    } 
 
}); 
 

 
const arr = [1,2,3,4]; 
 
const arr2 = [5,6,7,8]; 
 

 
console.log(arr.__lookupGetter__("last") === arr2.__lookupGetter__("last")); // => true iff there is only one last()-function

+0

ありがとうございました。 – ystal

1

Array.prototype.last = function() { 
 
     return this[this.length - 1]; 
 
    }; 
 
var arr = [1,2,3,4]; 
 
console.log(arr.last());

これを取得するには、Arrayを拡張することができます。

+0

心から感謝します。 – ystal