javascript - instanceof運算符
黄舟
黄舟 2017-05-19 10:26:43
0
3
692

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,這是為什麼?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
伊谢尔伦

樓主,你可以試試 你的 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
世界只因有你

這個文章中用的標準是ES3的

ES6的instanceof标准更长一点, 规定了当type(L)不是Object时L instanceof R 應當回傳false. 這個模擬程式碼不適用

曾经蜡笔没有小新

有一部分是原型鏈的內容,在你的模擬程式碼中:

    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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!