1、原型:prototype 每个函数都有一个prototype属性
2、原型链:__proto__ 每个对象都有__proto属性
/***
* 原型:prototype 每个函数都有一个prototype属性
* 原型链:__proto__ 每个对象都有__proto属性
*/
function Animal(){
this.type="哺乳类";
}
Animal.prototype.type='哺乳';
console.log(Animal.prototype);
let animal=new Animal(); //实例对象类型
console.log(animal.__proto__==Animal.prototype); //指向当前类的原型,animal 是属于Animal类的
console.log(animal.type); // 实例会先找自己的属性,自己没有会沿着原型找到原型
// 类、 实例(__proto__)==>类的原型(__proto__)
delete animal.type; //删掉实例上的属性
console.log(animal.type);
console.log(animal.__proto__.__proto__); //Object.prototype
console.log(Animal.prototype.constructor==Animal);
console.log(Object.prototype.__proto__); //null 不是对象类型,不能继续向上找了。
// Object.prototype.__proto__ 顶层的对象
// 特殊的 Function Object 可以充当对象,可以充当函数
// __proto__ prototype 两个都有
Function.__proto__===Function.prototype //所属类的原型。 js内部强制的指定,保证统一性
Object.__proto__===Function.__proto__=== Function.prototype //Object充当函数的时候,函数的链,对应的就是Function.__proto__
// 对象的链指向Object==>prototype
function Animal1(){
this.a=1;
}
Animal1.prototype.b=2;
let animal1=new Animal1();
console.log(animal1.hasOwnProperty('a')) //判断当前属性,是否在实例上。不能判断在原型上的属性
console.log(a in animal1); // in关键字 会判断这个属性是否属于原型 或者实例
// hasOwnProperty 只会看是否存在于当前实例上。