2012-01-26 7 views
7

Object.createで作成された配列は、配列のように散りばめられ、配列のように突っ張られますが、実際の配列ではありません。少なくともv8/node.jsで Object.createで作成されたJavascript配列 - 実際の配列ではありませんか?

> a = [] 
[] 
> b = Object.create(Array.prototype) 
{} 
> a.constructor 
[Function: Array] 
> b.constructor 
[Function: Array] 
> a.__proto__ 
[] 
> b.__proto__ 
[] 
> a instanceof Array 
true 
> b instanceof Array 
true 
> Object.prototype.toString.call(a) 
'[object Array]' 
> Object.prototype.toString.call(b) 
'[object Object]' 

いくつかのJavascriptの第一人者は、それがそうである理由を説明することができ、そして私の新しく作成された配列は、実数配列と区別がつかないように、どのようにそれを作るには?

ここでの目標は、カスタムプロパティがアタッチされている可能性のある配列を含むデータ構造を複製することです。もちろん、Object.definePropertyを使用して、新しく作成された配列にプロパティを手動で追加することはできますが、Object.createを使用する方法がありますか?

+0

あなたの目標には分かりません。 完全にindistingushableにする方法 - 'b = []';を使用してください。 – kirilloid

+0

@kirilloid - これはいくつかの状況では有効なアプローチかもしれませんが、factory関数がprototypeParamに基づく配管を内部的に行うと言う状況では、あなたの提案はオプションではありません。例えば。 monoidの作成では、以下から始めてください:var monad = Object.create(prototypeParam);ここで、prototypeParamがArray.prototype – arcseldon

答えて

4

短い答えはノーです。 This articleで詳しく説明しています。

+0

の場合、非常に興味深いでしょう! –

+0

回避策については、http://www.bennadel.com/blog/2292-Extending-JavaScript-Arrays-While-Keeping-Native-Bracket-Notation-Functionality.htmを参照してください。 – Gili

3

いいえ、できません。 Object.createはすべてプロトタイプについてですが、[]Object.create(Array.prototype)の両方が同じプロトタイプオブジェクトを継承しています。あなたは「希望Object.prototype.toString行動」と呼んで何

Object.createで設定することは不可能である、オブジェクトの内部[[Class]]です。 "真の配列"(Arrayクラスとspecial array behaviour - インデックス付きプロパティ、.length)を作成するには、array literalsまたはcalling the Array constructorを使用する必要があります。

関連する問題