https://www.ibm.com/developer...
根據(jù)此文
instaceof可以用下列程式碼模擬
function instance_of(L, R) {//L 表示左表達(dá)式,R 表示右表達(dá)式
var O = R.prototype;// 取 R 的顯示原型
L = L.__proto__;// 取 L 的隱式原型
while (true) {
if (L === null)
return false;
if (O === L)// 這里重點(diǎn):當(dāng) O 嚴(yán)格等于 L 時(shí),返回 true
return true;
L = L.__proto__;
}
}
但是
var a=1;
instance_of(a,Object)為true
a instanceof Object卻傳回false,這是為什麼?
人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!
樓主,你可以試試 你的 instance_of
是代替不了 instanceof
的
首先,明確你的樣本 a 是Number 類型
但是,執(zhí)行結(jié)果如下
instance_of(a, Object) // true
instance_of(a, Number) // true
修改 instance_of 方法:
function instance_of(L, R) {
try {
var O = R.prototype;// 取 R 的顯示原型
L = Object.getPrototypeOf(L);// 取 L 的隱式原型
while (true) {
if (L === null)
return false;
if (O === L)// 這里重點(diǎn):當(dāng) O 嚴(yán)格等于 L 時(shí),返回 true
return true;
L = L.Object.getPrototypeOf(L);
}
} catch (e) {
return false
}
}
再次實(shí)驗(yàn):
var a = 1
instance_of(a, Object) // false
instance_of(a, Number) // true
var parent = function () {}
var child = new parent()
instance_of(child, parent) // true
這個(gè)文章中用的標(biāo)準(zhǔn)是ES3的
ES6的instanceof
標(biāo)準(zhǔn)更長(zhǎng)一點(diǎn), 規(guī)定了當(dāng)type(L)
不是Object時(shí)L instanceof R
應(yīng)當(dāng)回傳false. 這個(gè)模擬程式碼不適用
有一部分是原型鏈的內(nèi)容,在你的模擬程式碼中:
function instance_of(L, R) {//L 表示左表達(dá)式,R 表示右表達(dá)式
var O = R.prototype;// 取 R 的顯示原型
L = L.__proto__;// 取 L 的隱式原型
while (true) {
if (L === null)
return false;
if (O === L)// 這里重點(diǎn):當(dāng) O 嚴(yán)格等于 L 時(shí),返回 true
return true;
L = L.__proto__;
}
}
L = L._proto_
代表著L會(huì)沿著原型鏈一直向上查找原型,而在本例中,最后是從Number包裝對(duì)象==>Object對(duì)象,而R就是Object,再經(jīng)過(guò)全等運(yùn)算符之后就返回true,所以instance_of(a,Object)
為true。
a instanceof Object
回傳false,是因?yàn)樗粫?huì)經(jīng)過(guò)原型鏈查找,直接就是Number物件的實(shí)例與Object的判斷,所以結(jié)果為false