javascript instanceof 内部机制探析_javascript技巧
比如:
// 代码 1
function Pig() {}
var pig = new Pig();
alert(pig instanceof Pig); // => true
function FlyPig() {}
FlyPig.prototype = new Pig();
var flyPig = new FlyPig();
alert(flyPig instanceof Pig); // => true
来看另一段代码:
// 代码 2
function Pig() { Pig.prototype = {/* some code */} }
var pig = new Pig();
alert(pig instanceof Pig); // => false
为何上面的猪 pig 不再是猪 Pig 了呢?
当一个对象是某个类的实例时,意味着这个对象具有该类的方法和属性。在 JavaScript 中,一个猪类的特性体现在原型中:
// 代码 3
function Pig() {}
Pig.prototype = {
"吃猪食": function() {},
"睡觉": function() {},
"长膘": function() {}
};
var pig = new Pig();
alert(pig instanceof Pig); //=> true
如果动态改变了猪的特性,让猪变成了牛:
// 代码 4
Pig.prototype = {
"吃草": function() {},
"犁田": function() {}
};
var niu= new Pig();
alert(pig instanceof Pig); //=> false
alert(niu instanceof Pig); //=> true
当未改变 Pig 的 prototype 时,猪还是猪,因此代码 3 中 pig 是 Pig 的实例。当改变 prototype 后,猪已经不是猪,而是披着猪皮的牛了。因此代码 4 中 pig 不再是 Pig 的实例,niu 反而是 Pig 的实例。
进一步分析前,先回顾一下 new 的内部机制。代码 2 中的 new Pig() 实际上等价为:
// var pig = new Pig() 的等价伪代码:
var pig = (function() {
var o = {};
o.__proto__ = Pig.prototype; // line 2
Pig.call(o);
Pig.prototype = {/* some code */}; // line 4
return o; // line 5
})();
可以看出,在 line 2 时,o.__proto__ 指向了 Pig.prototype 指向的值。但在 line 4 时,Pig.prototype 指向了新值。也就是说,在 line 5 返回时,pig.__proto__ !== Pig.prototype. 正是这个变化,导致了代码 2 中的 pig 不是 Pig.
已经可以大胆推论出:instanceof 判断 pig 是不是 Pig 的依据是:看隐藏的 pig.__proto__ 属性是否等于 Pig.prototype !
为了进一步确认,我们可以在 Firefox 下模拟 instanceof 的内部实现代码:
/**
* Gecko 引擎下,模拟 instanceof
*/
function _instanceof(obj, cls) {
// instanceof 的左操作数必须是非null对象或函数对象
if((typeof obj !== "object" || obj === null)
&& typeof obj !== "function") {
return false;
}
// instanceof 的右操作数必须是函数对象
if(typeof cls !== "function") {
throw new Error("invalid instanceof operand (" + cls + ")");
}
// 向上回溯判断
var p = obj.__proto__, cp = cls.prototype;
while(p) {
if(p === cp) return true;
p = p.__proto__;
}
return false;
}
测试页面:simulate-intanceof.html
最后考考大家:
function Bird() {}
var bird = new Bird();
var o = {};
bird.__proto__ = o;
Bird.prototype = o;
alert(bird instanceof Bird); // true or false?

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

instanceof的作用是判斷一個物件是否是某個類別的實例,或者是否實作了某個介面。 instanceof是一個用來檢查物件是否為指定類型的運算子。 instanceof運算子使用場景:1、類型檢查:可以用來判斷一個物件的具體類型,以便根據不同類型執行不同的邏輯;2、介面判斷:可以用來判斷一個物件是否實現了某個接口,以便根據介面的定義呼叫對應的方法;3、向下轉型等等。

概念1、此運算子用於操作物件的例子,檢查物件是否為特定類型(類型或介面類型)。格式2、如果計算器左側變數所指的對像是操作器右側類別或介面的對象,則結果是真實的。 (Objectreferencevariable)instanceof(class/interfacetype)實例packagecom.verify_instanceof;publicclassTestInstanceOf{publicstaticvoidmain(String[]args){//下方四行程式碼用來證明:instanceof

instanceof是JavaScript 中的一個操作符,用於檢測構造函數的”prototype“屬性是否出現在對象的原型鏈中的任何位置,語法為”object instanceof constructor“,其中object是要檢測的對象,constructor是要進行檢查的構造函數。

在Java中,instanceof是一個二元運算符,用於檢查一個物件是否是一個類別的實例,或者是一個類別的子類別的實例,其語法形式為“object instanceof class”,其中,object是一個對象引用,class是一個類別名稱或介面名稱。

原因是: instanceof運算子用來檢查一個物件是否是某個特定類別(或其衍生類別)的實例。如果物件不是一個類別的實例,那麼就無法進行類型判斷,因此會拋出錯誤。為了避免這種錯誤,在使用instanceof運算子時,需要確保物件是一個類別的實例。如果不確定物件的類型,可以使用其他方式進行類型判斷。

在使用instanceof運算子檢查物件的類型時,如果結果為true,表示物件是指定類型的實例。但是,編譯器並不會自動將物件轉換為指定類型,因此需要進行強制類型轉換。強制類型轉換是將一個物件從一種類型轉換為另一種類型的操作。在使用instanceof運算子後,如果確定物件是指定類型的實例,並且希望以該類型進行操作,就需要進行強制類型轉換。

不用instanceof的原因有:1、正在使用的程式語言可能不支援instanceof運算符,;2、認為使用其他方法可以更好地實現需求,在某些情況下,使用其他方法來檢查物件類型可能更有效或更適合你的需求;3、不熟悉instanceof運算子的使用方式或不確定它的行為;4、在某些情況下,使用"instanceof" 可能不是最佳的選擇。

此運算符僅用於物件引用變數。此運算符檢查物件是否屬於特定類型(類別類型或介面類型)。 instanceof運算子寫為-(Objectreferencevariable)instanceof(class/interfacetype)如果運算子左側變數所引用的物件通過了右側類別/介面類型的IS-A檢查,則結果將為true。以下是一個範例-範例 現場示範publicclassTest{ publicstaticvoidmain(Stringargs[]){&nbs
