instanceof
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐпеÑаÑÐ¾Ñ instanceof пÑовеÑÑеÑ, пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð»Ð¸ обÑÐµÐºÑ Ðº опÑеделÑÐ½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ. ÐÑÑгими Ñловами, object instanceof constructor пÑовеÑÑеÑ, пÑиÑÑÑÑÑвÑÐµÑ Ð»Ð¸ обÑÐµÐºÑ constructor.prototype в ÑепоÑке пÑоÑоÑипов object.
ÐнÑеÑакÑивнÑй пÑимеÑ
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car("Honda", "Accord", 1998);
console.log(auto instanceof Car);
// Expected output: true
console.log(auto instanceof Object);
// Expected output: true
СинÑакÑиÑ
object instanceof constructor
ÐаÑамеÑÑÑ
object-
ÐÑовеÑÑемÑй обÑекÑ.
constructor-
ФÑнкÑиÑ-конÑÑÑÑкÑоÑ, на коÑоÑÑÑ Ð¸Ð´ÑÑ Ð¿ÑовеÑка.
ÐпиÑание
ÐпеÑаÑÐ¾Ñ instanceof пÑовеÑÑеÑ, пÑиÑÑÑÑÑвÑÐµÑ Ð»Ð¸ обÑÐµÐºÑ constructor.prototype в ÑепоÑке пÑоÑоÑипов object.
// обÑÑвлÑем конÑÑÑÑкÑоÑÑ
function C() {}
function D() {}
var o = new C();
// true, Ñак как: Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// false, Ñак как D.prototype не пÑиÑÑÑÑÑвÑÐµÑ Ð² ÑепоÑке пÑоÑоÑипов o
o instanceof D;
o instanceof Object; // true, Ñак как:
C.prototype instanceof Object; // true
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
// false, Ñак как C.prototype оÑÑÑÑÑÑвÑÐµÑ Ð² ÑепоÑке пÑоÑоÑипов o
o instanceof C;
D.prototype = new C(); // add C to [[Prototype]] linkage of D
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true, Ñак как C.prototype ÑепеÑÑ Ð¿ÑиÑÑÑÑÑвÑÐµÑ Ð² ÑепоÑке пÑоÑоÑипов o3
ÐбÑаÑиÑе внимание: ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑа instanceof завиÑÐ¸Ñ Ð¾Ñ ÑвойÑÑва constructor.prototype, поÑÑÐ¾Ð¼Ñ ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑого ÑвойÑÑва. Также ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑоÑоÑипа object (или ÑепоÑки пÑоÑоÑипов) Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Object.setPrototypeOf или неÑÑандаÑÑного ÑвойÑÑва __proto__.
instanceof и множеÑÑвеннÑе конÑекÑÑÑ (напÑимеÑ, ÑÑÐµÐ¹Ð¼Ñ Ð¸Ð»Ð¸ окна)
РазлиÑнÑе конÑекÑÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе ÑÑÐµÐ´Ñ Ð²ÑполнениÑ. ÐÑо ознаÑаеÑ, ÑÑо они имеÑÑ ÑазлиÑнÑе built-ins (ÑазнÑй глобалÑнÑй обÑекÑ, ÑазлиÑнÑе конÑÑÑÑкÑоÑÑ Ð¸ Ñ.д.). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð²Ð°ÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑезÑлÑÑаÑÑ. ÐапÑимеÑ, [] instanceof window.frames[0].Array веÑнÑÑ false, поÑÐ¾Ð¼Ñ ÑÑо Array.prototype !== window.frames[0].Array а маÑÑив наÑледÑеÑÑÑ Ð¾Ñ Array.
ÐÑо Ð¼Ð¾Ð¶ÐµÑ ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑÑÑеÑÑвенной пÑоблемой ÑнаÑала, но пÑи ÑабоÑе Ñ Ð½ÐµÑколÑкими ÑÑеймами или окнами, и пеÑедаÑи обÑекÑов из одного конÑекÑÑа в дÑÑгой Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ ÑеÑÑÑзной пÑоблемой. С дÑÑгой ÑÑоÑонÑ, безопаÑно пÑовеÑиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ некоÑоÑÑй обÑÐµÐºÑ Ð¼Ð°ÑÑивом можно иÑполÑзÑÑ Array.isArray(myObj).
ÐапÑимеÑ, Ð´Ð»Ñ Ð¿ÑовеÑки Ñого, ÑÑо Node ÑвлÑеÑÑÑ SVGElement в ÑазнÑÑ
конÑекÑÑаÑ
можно иÑполÑзоваÑÑ myNode instanceof myNode.ownerDocument.defaultView.SVGElement.
ÐÑимеÑание:
ÐÑполÑзование XPCOM instanceof в коде Ð¸Ð¼ÐµÐµÑ ÑпеÑиалÑнÑй ÑÑÑекÑ: obj instanceof xpcomInterface (напÑÐ¸Ð¼ÐµÑ Components.interfaces.nsIFile) вÑзÑÐ²Ð°ÐµÑ obj.QueryInterface(xpcomInterface) и возвÑаÑÐ°ÐµÑ true еÑли пÑовеÑка на QueryInterface пÑоÑла ÑÑпеÑно. ÐобоÑнÑм ÑÑÑекÑом ÑÑого вÑзова ÑвлÑеÑÑÑ Ñо, ÑÑо можно иÑполÑзоваÑÑ ÑвойÑÑва xpcomInterface на obj поÑле ÑÑпеÑной пÑовеÑки Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ instanceof. РоÑлиÑии Ð¾Ñ ÑÑандаÑÑнÑÑ
глобалÑнÑÑ
JavaScript Ñипов, пÑовеÑка obj instanceof xpcomInterface ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº ожидаеÑÑÑ, даже еÑли obj оÑноÑиÑÑÑ Ðº дÑÑÐ³Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑекÑÑÑ.
ÐÑимеÑÑ
>ÐоказÑваеÑ, ÑÑо String и Date имеÑÑ Ñип Object и гÑаниÑнÑе ÑлÑÑаи
СледÑÑÑий код иÑполÑзÑÐµÑ instanceof, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ ÑÑо обÑекÑÑ String и Date Ñакже имеÑÑ Ñип Object (они ÑвлÑÑÑÑÑ Ð½Ð°Ñледниками Object).
Ðднако, обÑекÑÑ, ÑозданнÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð»Ð¸ÑеÑалов, ÑвлÑÑÑÑÑ Ð¸ÑклÑÑениÑми â Ñ
оÑÑ Ð¸Ñ
prototype Ñавен undefined, вÑÑажение instanceof Object возвÑаÑÐ°ÐµÑ true.
var simpleStr = "ÐÑо обÑÑÐ½Ð°Ñ ÑÑÑока";
var myString = new String();
var newStr = new String("СÑÑока, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа");
var myDate = new Date();
var myObj = {};
simpleStr instanceof String; // возвÑаÑÐ°ÐµÑ false, пÑовеÑÑÐµÑ ÑепоÑÐºÑ Ð¿ÑоÑоÑипов
myString instanceof String; // возвÑаÑÐ°ÐµÑ true
newStr instanceof String; // возвÑаÑÐ°ÐµÑ true
myString instanceof Object; // возвÑаÑÐ°ÐµÑ true
myObj instanceof Object; // возвÑаÑÐ°ÐµÑ true, неÑмоÑÑÑ Ð½Ð° пÑоÑоÑип, ÑавнÑй undefined
({}) instanceof Object; // возвÑаÑÐ°ÐµÑ true, аналогиÑно пÑедÑдÑÑей ÑÑÑоÑке
myString instanceof Date; // возвÑаÑÐ°ÐµÑ false
myDate instanceof Date; // возвÑаÑÐ°ÐµÑ true
myDate instanceof Object; // возвÑаÑÐ°ÐµÑ true
myDate instanceof String; // возвÑаÑÐ°ÐµÑ false
ÐоказÑваеÑ, ÑÑо mycar Ð¸Ð¼ÐµÐµÑ Ñип Car и Ñип Object
СледÑÑÑий код ÑоздаÑÑ Ñип Car и ÑкземплÑÑ ÑÑого Ñипа, mycar. ÐпеÑаÑÐ¾Ñ instanceof показÑваеÑ, ÑÑо обÑÐµÐºÑ mycar Ð¸Ð¼ÐµÐµÑ Ñип Car и Ñип Object.
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car; // возвÑаÑÐ°ÐµÑ true
var b = mycar instanceof Object; // возвÑаÑÐ°ÐµÑ true
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # sec-relational-operators > |