15

このページには次のように記載されています。

注: isPrototypeOf は instanceof 演算子とは異なります。AFunction の式オブジェクト インスタンスでは、オブジェクト プロトタイプ チェーンは、AFunction 自体ではなく、AFunction.prototype に対してチェックされます。

わかりました、彼らが私たちに伝えようとしていることはよくわかりません。object instanceof AFunctionAFunction.prototype.isPrototypeOf(object) とまったく同じではありませんか? または私は間違っていますか?

なぜ必要なのisPrototypeOfですか?

私がする必要があるp.isPrototypeOf(o)なら、私はただすることができませんでしたo instanceof p.constructorか?

さらに、機能的には?p.isPrototypeOf(o)と同等です。p===Object.getPrototypeOf(o)

4

3 に答える 3

15

オブジェクト コンストラクターはファンキーなものです。この回答から:

Pointyが指摘したように、彼の答えで

「コンストラクター」プロパティは、オブジェクト自体ではなく、オブジェクトのプロトタイプを作成した関数への参照です。

これに対処する通常の方法は、 への constructor代入後にオブジェクトのプロトタイプ プロパティを拡張することprototypeです。

オブジェクトのコンストラクターは読み取り専用ではないため、これが可能です。p.constructor作成後に任意の値を割り当てることができましたpが、これを使用すると完全に壊れてしまいます

o instanceof p.constructor

それ以外の

p.isPrototypeOf(o)

参考文献


再編集:OP編集

さらに、機能的には?p.isPrototypeOf(o)と同等です。p===Object.getPrototypeOf(o)

Object.getPrototypeOfJavaScript 1.8.1まで導入されなかったという事実を除けば、それらは元の質問よりも似ていますか? John Resig -Object.getPrototypeOfを参照してください。おそらくより関連性があるのは、2 つの関数の仕様が異なることです。(警告、PDF リンク)

15.2.3.2 Object.getPrototypeOf

15.2.4.6 Object.prototype.isPrototypeOf

于 2011-05-12T03:44:16.873 に答える
7

ここでの最も重要な違いは、 isPrototypeOf メソッドを使用すると、オブジェクトが別のオブジェクトから直接継承されているかどうかを確認できることです。次の点を考慮してください。

var t = new Object();
var f = new Object();
var c = Object.create(t);

c instanceof f.constructor; // true
c instanceof t.constructor; // true
f.isPrototypeOf(c); // false
t.isPrototypeOf(c); // true

ご覧のとおり、コンストラクターはオブジェクトをインスタンス化した関数にすぎません。実装指定子ではありません。したがって、t.y = function(){ return true; }プロトタイプチェーンを介して適切な実装を返すことf.y = function(){ return false; }を確認する必要がある場合、あまり役に立ちません。cinstanceof

于 2011-05-12T03:40:23.803 に答える
1

instanceOf --> このオブジェクト (または派生元のオブジェクト) は、名前付きオブジェクトをプロトタイプとして使用しました

isPrototypeOf --> このオブジェクトは、指定されたオブジェクト (またはそれが派生したオブジェクト) によってプロトタイプとして使用されました。

すなわち。

instanceOf はオブジェクトの祖先を照会しています。

IsPrototypeOf は、オブジェクトの子孫を照会しています。

于 2011-05-12T03:33:29.567 に答える