原型和原型链---------------------------【凤、影】

000构造函数
function Cat(name,age){//构造函数里this.xxx 属性是私有的属性  方法是私有的方法
            this.name = name;
            this.age = age ;
            this.playMusic = function(){
                console.log('乱叫....')
            }
        }
        let cat1 = new Cat('白猫','1');
        let cat2 = new Cat('黑猫','3');
        console.log(cat1.name) //白猫
        console.log(cat2.age)//3
        console.log(cat1.playMusic === cat2.playMusic)//false 因为new出来的实例上的方法 是私有的方法 解决这个问题引入了prototype属性 叫做原型属性
 
        //1、写在构造函数外面的属性叫做原型属性  方法叫做原型方法(公有属性/公有方法)
        //2、通过  构造函数.prototype.属性   创建原型属性       构造函数.prototype.方法  创建原型方法
        //  优点 : 
        //  基于构造函数的原型(prototype)解决了  方法和属性公有的问题
        Cat.prototype.eat = function(){
            console.log('光吃不干活');
            return 1 //没什么含义 就是为了不想控制台输出函数的返回值undefined 自定了个返回1
        }
        console.log(cat1.eat())//光吃不干活
        console.log(cat2.eat())//光吃不干活
        console.log(cat1.eat === cat2.eat)//true
      //3、实例访问属性和方法先去实例上找 实例上没有再去原型上找

001深入原型

接上面的例子
//
用代码验证构造函数的原型 指向它所属的类 console.log(Cat.prototype.constructor == Cat);//true // 实例对象上的__proto__指向他所属类的原型 console.log(cat1.__proto__ == Cat.prototype);//true //构造函数原型上的__proto__ 指向object的原型 console.log(Cat.prototype.__proto__ == Object.prototype);//true //实例上的__proto__属性上的__proto__指向object的原型 console.log(cat1.__proto__.__proto__ === Object.prototype)//true

002做了一个一个图

003原型链zu

所谓的原型链 就是由__proto__隐式属性决定的一条链  访问实例属性的时候 如果实例上没有 就去原型上找 属性和方法  ,一层一层找下去

object.__proto__指向null

也有的说只有显式原型prototype和隐式原型__proto__组成的 两条链叫原型链。

004瞎弄的玩的

 console.log(Object.prototype.__proto__);
        let obj = new Object()
        console.log(obj.__proto__.__proto__)

 

posted on 2020-05-09 01:57  凤,独影  阅读(123)  评论(0)    收藏  举报