JavaScript原型和原型链

103 阅读1分钟

图解原型和原型链的关系

  • 十分感谢参考中三篇文章的作者,笔者结合自身的知识和对文章的理解,总结了如下笔记和图
    • 每个实例的__proto__属性指向它的构造函数的原型(prototype)上

      • 如:myPuppy的构造函数是Puppy,所以它的__proto__指向Puppy.prototype
      • Puppy的构造函数是Function,所以它的__proto__指向Function.prototype
      • Puppy.prototype的构造函数是Object,所以它的__proto__指向Object.prototype
      • Object.prototype没有构造函数,所以它的__proto__指向null
    • 每个实例对象在查找一个属性时先找自身,然后再沿着__proto__这条原型链上寻找

    • 每条原型链的最顶层是Object.prototype._ _proto _ _ -> null

    • 静态方法在构造函数上,实例方法在实例上

补充

总结

  • 最近在复习到instanof的时候,发现之前对原型和原型链的知识总结不够全面,因此在此补充
    • 函数都是由Function创建的,而prototype属性指向的空间则是由function Object创建的

    • __ proto __ 属性指向它的构造函数的原型上

    • 特别的:Function.__ proto __ 指向Function.prototype,Object.prototype.__ proto __ 指向null

      image.png

instanceof

object instanceof constructor:沿着object的原型链上判断是否存在constructor的原型

function instance_of(L,R) {
    var L = L.__proto__
    var R_pro = R.prototype
    // L不断沿着__proto__属性上寻找R.prototype
    while (true) {
        if (L === null) return false // Object.prototype.__proto__ 或 Object.create(null)
        else if (L === R_pro) return true
        L = L.__proto__
    }
}
  • 测试案例
console.log('----------------------')
console.log(String instanceof String) // false
console.log(Object instanceof Object) // true
console.log(Function instanceof Function) // Function.prototype true
console.log(Function instanceof Object) // Object.prototype true

function Foo(){} 
function BFoo(){} 
Foo.prototype = new BFoo()
console.log(Foo instanceof Function) // Function.prototype true
console.log(Foo instanceof Foo) // false



console.log('----------------------')
console.log(instance_of(String,String))
console.log(instance_of(Object,Object))
console.log(instance_of(Function,Function))
console.log(instance_of(Function,Object))

function Foo1(){} 
function BFoo1(){} 
Foo1.prototype = new BFoo1()
console.log(instance_of(Foo1,Function))
console.log(instance_of(Foo1,Foo1))

参考