在 JavaScript 中,instanceof
运算符用于检查一个对象是否是另一个对象的实例。它的使用形式是 obj instanceof constructor
,其中 obj
是要检查的对象,constructor
是要检查的构造函数。
instanceof
运算符的实现逻辑如下:
-
首先,它会检查
constructor
是否是一个函数。如果constructor
不是一个函数,instanceof
运算符会抛出一个TypeError
。 -
如果
constructor
是一个函数,它会检查obj
是否具有一个名为[[Prototype]]
的内部属性。这个属性代表了obj
的原型对象。 -
接下来,
instanceof
运算符会检查constructor
是否具有一个名为prototype
的属性。这个属性代表了构造函数的原型对象。 -
如果
obj
的原型对象和构造函数的原型对象相等,或者如果obj
的原型链中有一个或多个对象的原型对象与构造函数的原型对象相等,那么obj
就被认为是constructor
的一个实例,instanceof
运算符返回true
。 -
如果
obj
的原型链上没有与构造函数的原型对象相等的原型对象,instanceof
运算符返回false
。
需要注意的是,instanceof
运算符只能检查对象是否是某个构造函数的实例,而不能用于检查对象是哪种具体类型的实例。另外,instanceof
运算符也无法跨越不同的 JavaScript 的全局执行上下文,因为每个全局执行上下文都有自己的原型链。
在 JavaScript 中,super()
是用于调用父类构造函数的特殊关键字。它只能在派生类的构造函数中使用,用来调用父类的构造函数以完成对父类的属性初始化。
使用 super()
的一般步骤如下:
-
在派生类的构造函数内部,使用
super()
进行调用,如super()
。 -
super()
必须在访问this
或者在派生类的构造函数中访问它之前调用。否则,会引发ReferenceError
。 -
调用
super()
后,它会执行父类的构造函数,并将当前实例作为this
传递给父类的构造函数。 -
父类的构造函数执行完成后,派生类的构造函数将继续执行,可以在派生类的构造函数中对自身的属性进行初始化。
使用 super()
的主要目的是在派生类的构造函数中获得父类的属性初始化。通过调用父类的构造函数,派生类可以确保在自己的构造函数中对继承的属性进行正确的初始化。
需要注意的是,如果派生类的构造函数没有显式地调用 super()
,则 JavaScript 引擎会默认在派生类构造函数的开头隐式调用 super()
,相当于 super.call(this)
。这样做是为了确保派生类的实例正确地继承父类的属性。