前端架构系列

原型和原型链

2020-06-28  本文已影响0人  羽晞yose

prototype

原型,每一个函数都有一个prototype属性,也叫原型对象

__proto__

原型链,每一个对象都有一个__proto__属性,指向它的构造函数的prototype属性,也叫继承属性

上面两个定位不太准确,因为根据MDN文档,其实一个叫原型对象,一个“是”继承属性(也不是prototype属性的名称),具体真要说原型是哪个,我也找不到准确的定义,但MDN上说了__proto__指向一个原型对象的链,所以就是所谓的原型链,而我们开发时经常说原型上的属性,所以我就将其认为是原型(如果有具体说明的文章请给我留言,好涨点知识)

代码图示说明

function Animal () {
    this.type = '动物';
}

Animal.prototype.type = '哺乳类';

let cat = new Animal();

console.log(cat.__proto__ === Animal.prototype); // true
原型与原型链
cat.__proto__ -> Animal.prototype
cat.__proto__ -> Animal.prototype -> Animal.prototype.__proto__ -> Object.prototype

验证:删除cat自身属性type,那么它会往上层继续查找,所以会输出哺乳类

console.log(cat.type); // 动物
delete cat.type;
console.log(cat.type); // 哺乳类

特别说明

一般对象和函数都遵循上面说法,但有个比较特殊,那就是FunctionObject之间在原型链上的关系,因为他们既是对象也是函数,所以有定义

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

hasOwnProperty 和 in 关键字

这两个都是用来查找对象属性的,区别在于:

function Animal() {}
Animal.prototype.type = '动物';

let cat = new Animal();

console.log(cat.hasOwnProperty('type')); // false
console.log('type' in cat); // true

Object.getPrototypeOf() 和 Object.setPrototypeOf()

虽然很多浏览器都实现了__proto__,但是__proto__并非javascript标准,所以ES6新增了Object.getPrototypeOf()Object.setPrototypeOf()方法来获取原型链

上一篇 下一篇

猜你喜欢

热点阅读