原型和原型链---------------------------【凤、影】
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__)