https://www.ibm.com/developer...
根據此文
instaceof可以用下列程式碼模擬
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
但是
var a=1;
instance_of(a,Object)為true
a instanceof Object卻傳回false,這是為什麼?
伊谢尔伦2017-05-19 10:28:43
樓主,你可以試試 你的 instance_of
是代替不了 instanceof
的
首先,明確你的樣本 a 是Number 類型
但是,執行結果如下
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)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.Object.getPrototypeOf(L);
}
} catch (e) {
return false
}
}
再次實驗:
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
世界只因有你2017-05-19 10:28:43
這個文章中用的標準是ES3的
ES6的instanceof
标准更长一点, 规定了当type(L)
不是Object时L instanceof R
應當回傳false. 這個模擬程式碼不適用
曾经蜡笔没有小新2017-05-19 10:28:43
有一部分是原型鏈的內容,在你的模擬程式碼中:
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
L = L._proto_
代表着L会沿着原型链一直向上查找原型,而在本例中,最后是从Number包装对象==>Object对象,而R就是Object,再经过全等运算符之后就返回true,所以instance_of(a,Object)
為true。
a instanceof Object
回傳false,是因為它不會經過原型鏈查找,直接就是Number物件的實例與Object的判斷,所以結果為false