9

Object.createで作成された配列は、配列のように歩き、配列のようにクワクするように見えますが、それでも実際の配列ではありません。少なくともv8/node.jsでは。

> 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ますか?

4

2 に答える 2

5

簡単な答えはノーです。この記事では、すべてを詳細に説明します。

于 2012-01-26T09:53:30.243 に答える
3

いいえ、あなたがすることはできません。Object.createはすべてプロトタイプに関するものですが、両方とも[]同じObject.create(Array.prototype)プロトタイプオブジェクトから継承します。

目的のObject.prototype.toStringの動作」と呼ばれるものは、オブジェクトの内部[[Class]]であり、で設定することはできませんObject.create。「真の配列」(Arrayクラスと特別な配列の動作-インデックス付きプロパティを使用)の作成は、配列リテラルを使用するか、コンストラクターを呼び出す.lengthことによってのみ可能です。Array

于 2014-10-22T18:34:35.773 に答える