原型和原型链

211 阅读2分钟
// 原型 prototype 原型链 __proto__
// 每一个类上或者函数上都会有一个prototype属性(都会有一个原型)
// 每一个对象都会有一个__proto__

function Animal(type) {
    this.type = type; // 实例上的属性
}
console.log(Animal.prototype) // {} 类的原型是一个对象
 
// Animal类的原型上可以添加方法和属性  这种的我们叫他为公共方法和属性

// 原型上的公共方法
Animal.prototype.say = function() {
    console.log('say')
}
// 原型上的公共属性
Animal.prototype.type = '马识途----';

let animal = new Animal('mmmmmm'); // 创建的实例都是一个对象类型
console.log('实例', animal); // 实例是一个对象 Animal { type: 'mmmmmm' }
console.log(Animal.prototype === animal.__proto__) // true
delete animal.type;

console.log(animal) // 


// 原型:每一个类上或者函数上都会有一个prototype属性(都会有一个原型)
// 当我们在我们new 出来的实例上找某一个属性的时候,如果这个实例上找不到,那么就会沿着圆形链继续往上找直到找到为止,如果找不到就为空
// 那么就会通过__proto__一直往上找,直到找到或者找到最顶层的prototype,而这个查找的链条就是原型链
// 什么时候为找到为止呢?? 找到Object这个类上的prototype原型上为终止  Object.prototype.__proto__ 就是最顶层的

//  访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着proto这条链向上找,这就是原型链。 (网上说法)


// 我们的原型上面会有一个 constructor 而这个 constructor 指向的是我们当前的类
console.log('----',Animal.prototype.constructor === Animal)  // true




// 特殊的 函数 Function Object (可以充当对象,也可以充当函数)
console.log(Function.__proto__ === Function.prototype); // true 这个规定好的

console.log(Object.__proto__ === Function.prototype); // true

console.log(Object.__proto__ === Function.__proto__); // true


// hasOwnProperty 只会判断是否在当前的实例上,在原型上的不管
console.log(animal.hasOwnProperty('type')); 

// in 关键字 会判断这个属性是否属于原型或者实例上的属性
console.log('type' in animal); 



// https://developer.ibm.com/zh/articles/1306-jiangjj-jsinstanceof/