1. // 方法一:
    2. // 变量 R 的原型是否存在于变量 L 的原型链上;
    3. function instance_of(L, R) {
    4. // 若变量 R 为基本数据类型,直接返回 false
    5. const baseType = ['string', 'number', 'boolean', 'undefined', 'symbol']
    6. if(baseType.includes(typeof(L))) return false;
    7. let RP = R.prototype; // 取 R 的显示原型
    8. L = L.__proto__; // 取 L 的隐式原型
    9. while(true) {
    10. if(L === null) return false; // 此时找到最顶层了
    11. if(L === RP) return true;
    12. L = L.__proto__; // 没找到时,继续向上一层原型链查找
    13. }
    14. }
    15. console.log(instance_of({}, Object))
    16. // 方法二:
    17. function myInstanceof(L, R) {
    18. // 若变量 R 为基本数据类型,直接返回 false
    19. const baseType = ['string', 'number', 'boolean', 'undefined', 'symbol']
    20. if(baseType.includes(typeof(L))) return false;
    21. // 获取实例对象原型
    22. let proto = Object.getPrototypeOf(L);
    23. // 获取构造函数的 prototype 对象
    24. let prototype = R.prototype;
    25. // 判断构造函数 R 的 prototype 对象是否在对象 L 的原型链上
    26. while(true) {
    27. if (!proto) return false
    28. if (proto === prototype) return true
    29. // 如果没有找到,就继续从其原型上找
    30. // Object.getPrototypeOf方法用来获取指定对象的原型(内部[[Prototype]]属性的值)
    31. proto = Object.getPrototypeOf(proto);
    32. }
    33. }
    34. console.log(myInstanceof('', Object))

    解析如下代码,证明 万物皆对象:

    1. function Foo(name) {
    2. this.name = name;
    3. }
    4. var f = new Foo('chen');
    5. f instanceof Foo; // true
    6. f instanceof Object; // true

    上述代码的判断流程大致如下:

    1. f instanceof Foof的隐式原型 __proto__Foo.prototype 是相等的,所以返回 true
    2. f instanceof Objectf的隐式原型 __proto__Object.prototype 是不等的,所以继续往上走。f的隐式原型 __proto__ 指向 Foo.prototype,所以继续用 Foo.prototype.__proto__去对比 Object.prototype,此时是相等的,因为 Foo.prototype就是一个普通的对象。