JS isPrototypeOf()方法:檢測一個物件是否存在於另一個物件的原型鏈中

2020-07-16 10:05:11
JavaScript isPrototypeOf() 是 Object 的原型方法(也稱實體方法),它定義在 Object.prototype 物件之上,所有 Object 的範例物件都會繼承 isPrototypeOf() 方法。

isPrototypeOf() 方法用來檢測一個物件是否存在於另一個物件的原型鏈中,如果存在就返回 true,否則就返回 false。

isPrototypeOf() 的語法格式如下:

prototypeObject.isPrototypeOf(object);

引數說明:object 引數是 Object 型別的一個物件,將對其原型鏈進行檢查。

返回值:isPrototypeOf() 函數的返回值為 Boolean 型別。如果 object 的原型鏈中存在 prototypeObject 物件,那麼返回 true;如果 object 不是物件,或者 object 的原型鏈中不存在 prototypeObject 物件,那麼返回 false。

在 JavaScript 中,Function 物件預定義了 prototype 屬性,該屬性指向一個原型物件。當定義建構函式時,系統會自動建立一個物件,並傳遞給 prototype 屬性,這個物件被稱為原型物件。原型物件可以儲存結構型別的原型屬性,以便於所有範例物件共用。

範例1

下面程式碼為自定義型別函數定義兩個原型成員。
var f = function () {}  //定義函數
f.prototype = {  //函數的原型物件
    a : 1,
    b : function () {
        return 2;
    }
}
console.log(f.prototype.a);  //讀取函數的原型物件的屬性a,返回1
console.log(f.prototype.b());  //讀取函數的原型物件的屬性b,返回2
當使用 new 運算子呼叫函數時,就會建立一個範例物件,這個範例物件將繼承建構函式的原型物件中所有的屬性。
var o = new f();  //範例物件
console.log(o.a);  //存取原型物件的屬性
console.log(o.b());  //存取原型物件的屬性
為了方便判定,Object 物件定義了 isPrototypeOf() 方法,該方法可以檢測一個物件的原型物件。

範例2

通過下面範例,可以判斷 f.prototype 就是物件 o 的原型物件,因為其返回值為 true。
var b = f.prototype.isPrototypeOf(o);
console.log(b);

範例3

下面範例演示了各種特殊物件的原型物件。

1) 函數的原型物件可以是 Object.prototype,或者是 Function.prototype。
var f = function () {}
console.log(Object.prototype.isPrototypeOf(f));  //返回true
console.log(Function.prototype.isPrototypeOf(f));  //返回true

2) Object 和 Function 物件的原型物件比較特殊。
console.log(Function.prototype.isPrototypeOf(Object));  //返回true
console.log(Object.prototype.isPrototypeOf(Function));  //返回true

3) Object.prototype 和 Function.prototype 的原型物件不是 Object.prototype,Function.prototype 的原型物件可以是 Function.prototype,但是 Object.prototype 的原型物件絕對不是 Function.prototype。
console.log(Object.prototype.isPrototypeOf(Object.prototype));  //返回false
console.log(Object.prototype.isPrototypeOf(Function.prototype));  //返回true
console.log(Function.prototype.isPrototypeOf(Function.prototype));  //返回false
console.log(Function.prototype.isPrototypeOf(Object.prototype));  //返回false