在JavaScript中,有一個關鍵字叫做instanceof,可用于判斷一個對象是否屬于某個類,即是否繼承自該類。該關鍵字的使用方式是“對象 instanceof 類”,返回值為布爾型(true或false)。下面我們具體了解一下該關鍵字的用法和相關知識點。
在例子中,我們定義了一個父類Person和一個子類Student,代碼如下:
function Person(name,age){ this.name = name; this.age = age; } function Student(name,age,school){ Person.call(this,name,age); this.school = school; } Student.prototype = new Person();
其中,父類Person有兩個屬性name、age,子類Student除了繼承了父類的兩個屬性外,還有自己的屬性school。我們可以先定義一個person對象作為父類的實例,再定義一個student作為子類的實例:
var person = new Person('Tom',20); var student = new Student('Tom',20,'University');
接著我們可以通過instanceof判斷person對象和student對象是否是Person類和Student類的實例:
console.log(person instanceof Person); // true console.log(student instanceof Person); // true console.log(student instanceof Student); // true
我們可以看到,person實例是Person類的實例,student實例既是Person類的實例,也是Student類的實例。這是因為子類繼承了父類的所有屬性和方法,因而擁有了父類的實例特征。
需要注意的是,使用instanceof判斷對象是否屬于某個類,實際上是判斷對象是否繼承自該類的prototype屬性。在上面的代碼中,我們使用Student.prototype = new Person()來實現繼承。當我們判斷對象student是否是Person類的實例時,實際上是判斷student對象的原型鏈上是否有Person.prototype。
此外,需要注意的是instanceof只能用于對象和類之間的關系判斷,無法用于普通值和類之間的判斷。我們可以通過以下代碼驗證:
console.log('hello' instanceof String); // false console.log(new String('hello') instanceof String); // true
第一個console輸出的是false,因為'hello'是普通值,不是String類的實例。第二個console輸出的是true,因為new String('hello')返回的是String對象。
最后,需要強調的是,instanceof關鍵字雖然可以用于判斷對象所屬的類,但面對多層繼承的情況,就比較容易出錯了。這時候就需要我們更加全面的考慮對象與類之間的關系,以及繼承關系。在進行多層繼承的情況下,建議使用ES6的class語法糖來定義類和繼承,這樣更容易理解和使用。