https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push
javascript
1let obj = { 2 length: 0, 3 4 addElem: function addElem (elem) { 5 // obj.length は、要素が追加されるたびに自動的に増分する。 6 Array.prototype.push.call(this, elem); 7 } 8}; 9 10// 例示のために空のオブジェクトを追加する。 11obj.addElem({}); 12obj.addElem({}); 13obj.addElem({}); 14 15console.log(obj.length); 16// → 3 17console.log(obj); 18// → {0: {…}, 1: {…}, 2: {…}, length: 3, addElem: f} 19console.log('--------------------------'); 20let obj_1={ 21 length : 0 22} 23 24obj_1.prop_1='prop_1'; 25 26console.log(obj_1.length); 27// 0 28console.log(obj_1); 29// {length: 0, prop_1: "prop_1"}
mdnのサンプルなんですが、まず前回の質問と同じで、addElemの中で
Array.prototype.push.call(this, elem);
としているのですが、これで
addElemを実行する度にobjにプロパティが追加されるのがなぜなのか?
なぜthisをobjに固定すると、オブジェクトであるobjにプロパティを追加できるのか?
と思ってしまうのですが、これは、pushがそういう風に作られているから、と理解しておくのが良いでしょうか?
というか、オブジェクトに対してArray.prototype.pushを使用する方法が上記の方法だ、という理解で問題ないでしょうか?
次に上記のサンプルの前半(----------------)よりも上の部分。でaddElemを実行する度にlengthプロパティが増えていくのですが、これは何の働きでこうなるのでしょうか。
objのlengthプロパティは組み込みで最初から用意されているのではなく、プログラマが勝手に用意したプロパティだと思うのですが、上記のコードだけで当然のようにlengthが増えているのがかなり不自然に思えます。
試しに上記サンプルの後半のように、自分でlengthプロパティを持ったオブジェクトobj_1を作って、obj_1に対してプロパティprop_1を追加してもlengthプロパティは0のままです。
あと上記mdnのページの中で
push はジェネリックメソッドとして用意されています。そのため call() や apply() と一緒にオブジェクトに対して利用することもできます。
と説明があるのですが、ジェネリックメソッドとは何ですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/03 02:15 編集
2019/10/04 01:30