天天看点

原型链理解和解析,原型链面试通关

var F = function () {

    };
    var G = function(){
        this.name = 'xiaoming'

    };
    G.prototype.each=function(){
        console.log("吃货")
    };
    Object.prototype.a=function () {//(2)所有的对象函数的__proto__都会有a函数对象
        console.log("a()")
    };

    Function.prototype.b = function () {
        console.log("b()")
    };
    //Function 指的是继承在所有的window上面的声明的函数

    var f = new F();
    var g = new G();
    console.log(a instanceof Function);//(1)
    //(1) Object是所有的对象的根,在根上面添加了一个对象a,其实就是添加到__proto__上面,Function默认是在object手动添加的对象a;以后添加的对象是a的子集可以这么理解 b就是子集
    console.log(Function instanceof Object);//true
    console.log(Object instanceof Function);//true
    console.log(F instanceof Object);//true
    console.log(F instanceof Function);//true
    console.log(f instanceof Function);//false
    console.log(f instanceof Object);//true
    console.log(F.prototype.__proto__);//原型的规则就是现在他自己的本身去查找然后早__proto__上面去找一层一层的去查看找
    console.log(f  instanceof F.prototype.constructor);//实力化的对象是构造函数的constructor的属性


    f.a.__proto__.b();//打印出 b() 结合(1)理解  所以在a对象的原型下面就可以找到b();如果直接f.b();就会找不到
  //  f.b();//报错 Uncaught TypeError: f.b is not a function 因为b对象是a对象的子集所以直接调用就会没有
    g.a.__proto__.b();//打印出 b() 结合(1)和(2)理解 也可以拿到b函数对象

    //f对象和g对象是构造函数的实例 构造函数上面添加了原型的方法在查找方法的时候就会在__proto__上面去查看所以g和f就能获取到b()函数对象,产生层级的原因看(1)
    console.log(f);
    console.log(g);//通过构造函数this添加就不会在__proto__,直接在实例化对象上面
    console.log(Object.prototype);//手动给Object对象添加的所有属性

//不足之处提出大家共同进步!谢谢