2016-09-30 8 views
2

は、私たちは新しいオブジェクトを作成してみましょう、そしてそのプロトタイプを変更します。初期プロトタイプずにオブジェクトに__proto__設定

var obj = new Object; 
obj.__proto__ = new Date; 
obj.setTime // is a function 

我々はobjは今、その新しいプロトタイプ、new Dateからプロパティを継承していることがわかります。

その後、我々はプロトタイプせずに新しいオブジェクトを作成し、そのプロトタイプを変更します。私たちは、チェーンが機能しないプロトタイプことがわかり

var obj = Object.create(null); 
obj.__proto__ = new Date; 
obj.setTime // undefined 

を - objはその__proto__があるにもかかわらず、new Dateからプロパティを継承しませんでしたnew Date

なぜですか?

(私はObjectは確か__proto__プロパティのセッターでのいくつかの内部のロジックを持っていますが、いないからだと思います)

+0

プロトタイプとして 'null'なのでを使用してオブジェクトを作成する場合、全ての被写体のためのプロトタイプチェーンがありませんので、' _proto__'セットが存在しないであろう。手動で '__proto__'を設定すると、それはオブジェクトの普通のプロパティになります。 ( 'obj .__ proto __。setTime' - > function) – Teemu

答えて

0

あなたがvar obj = Object.create(null);を行うと、あなたは__proto__せずにオブジェクトを作成します。

行末の行には、__proto__という名前のフィールドが作成され、フィールド自体には、__proto__という内部フィールドがあります。

任意の名前のフィールドを作成できます。あなたの場合、フィールドの名前として__proto__を選択しました。それは何かだったかもしれない。

1

これは、オブジェクトのプロトタイプに明示的にアクセス/修正する必要がある場合、__proto__Object.getPrototypeOf()/Object.setPrototypeOf()の微妙な違いの1つです。

これはとObject.getPrototypeOf()__proto__の代わりに使用する必要があると私自身が確信している理由の1つです。

var o = Object.create(null); 
 
Object.setPrototypeOf(o, new Date()); 
 
console.log(o.setTime)

+0

[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)はかなり確信しているようですオブジェクトのプロトタイプをまったく変更しないでください。 – Teemu

+0

@Teemu配列サブクラス化(http://stackoverflow.com/a/39653262/4543207)や配列サブクラス化が必要なときがあります'Array.prototype'を全く変更せずにプロトタイプメソッドを呼び出すことができます。 – Redu

+0

本当ですが、私はコードで多くの配列のサブクラスを見たことがありません。通常、Arrayプロトタイプは猿で喜んでパッチしているだけです。 Kangaxは主題の[興味深いarcticle](http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/)を書いています。 – Teemu

関連する問題