美文网首页
js原型链

js原型链

作者: pretty_rain | 来源:发表于2019-06-19 11:40 被阅读0次

    通过一个案例理解原型链

        Function.prototype.a = "a";
        Object.prototype.b = "b";
        function Person(){}
        console.log(Person);    //function Person()
        Person p = new Person();
        console.log(p);         //Person {} 对象
        console.log(p.a);       //undefined
        console.log(p.b);     //b
    

    p是Person()的实例,是一个Person对象,它拥有一个属性值 __ proto __ ,并且__ proto __是一个对象,包含两个属性值constructor和 __ proto __

        console.log(p.__proto__.constructor);
        console.log(p.__proto__.__proto__);
    

    p. __ proto__.constructor得到的是Person()这个构造函数
    p.__ proto __ .__ proto __ .constructor得到拥有多个参数的Object()函数,Person.prototype的隐式原型的构造函数指向Object(),即Person.prototype. __ proto __ .constructor == Object()

    image.png

    总结:

    1.查找属性,如果本身没有,则会去proto中查找,也就是构造函数的显式原型中查找,如果构造函数中也没有该属性,因为构造函数也是对象,也有proto,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined
    2.p.__ proto __.constructor == function Person(){}

    3.p.__proto __.__proto __== Object.prototype

    4.p.__proto __.__proto __.__proto __== Object.prototype.__proto __ == null

    5.通过__proto __形成原型链而非protrotype

    分析图

    image.png

    完整的原型链

    Product.prototype={}
    var p = new Product();
    console.log(p.__proto__ == Product.prototype);
    console.log(Product.__proto__ == Function.prototype);
    console.log(Function.prototype.__proto__ == Object.prototype);
    console.log(Product.prototype.__proto__ == Object.prototype);
    console.log(Object.prototype.__proto__ == null);
    var kong = {};//Object对象
    console.log(kong.__proto__ == Object.prototype);
    

    相关文章

      网友评论

          本文标题:js原型链

          本文链接:https://www.haomeiwen.com/subject/ynehqctx.html