原型和原型链
一、前言
以前有花时间去学习这方面的知识,但没有及时做笔记总结,导致工作过后就忘的一干二净了。 趁有空余时间,把这方面的知识梳理一下,做成文章,也方便以后的温习。 这方面也是js比较重要的一个知识点,只有理解了原型和原型链,才能更好的去理解js。
二、构造函数
class构造函数和普通函数是一样的,只是class更加贴合面向对象的写法,也更易读和理解。在这里就使用class来为大家举例,如果不清楚可以到我的另一篇 “教你如何用class继承” 的文章哦。
三、原型
概念:JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象。prototype对象属性的所有属性和方法都会被构造函数的实例继承。这意味着我们可以把那些公用的属性和方法,直接定义在prototype对象属性上。 prototype就是调用构造函数所创建的实例对象的原型(proto)。js在创建对象的时候,都有一个叫做proto的属性,用于指向它的函数对象的原型对象prototype。prototype可以让所有的对象实例共享它包含的属性和方法。
(稍微抽象了点,我把他总结以下两大点)
原型关系:
1、原型分为隐形原型__proto__ 和显式原型prototype
2、每个class都有显式原型prototype
3、每个实例都有隐式原型__proto__
4、实例的__proto__指向对应的prototype(也是全等的关系)
基于原型的执行规则:
1,获取实例的方法或者实例的属性时
2,现在自身属性和方法里寻找
3,找不到的时候则自动去__proto__里寻找
下面看下代码示例:
// 创建原型
class Student{
constructor(name,number){
this.name = name
this.number = number
}
}
// 实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
const xialuo = new Student('夏洛',100)
console.log(xialuo.name); //夏洛
console.log(xialuo.number); //100
// 创建原型的方法
Student.prototype.sayHello = function (){
console.log(this.name + ", hello");
};
xialuo.sayHello(); // 夏洛,hello
//构造函数的prototype和其实例的__proto__是指向同一个地方的
console.log(Student.prototype === xialuo.__proto__) // true
四、原型链
每个构造函数都有一个prototype,定义的方法都在prototype上,会先在自身开始查找属性和方法,如果没有,就在当前位置的隐式原型查找。该对象的隐式原型指向的是父元素的显示原型。如果还找不到,再往上层找。 直到找到Object.prototype.__proto__ (也就是null),就结束。这个逐级往上找的过程,形成了链式,就称为'原型链'。
如下图所示:
五、instanceof
作用就是:用于判断该对象是否存在于这个原型链上
通俗的理解: 右侧是不是左侧的爸爸、爷爷、祖宗,只要左侧对象继承自右侧函数就为true
代码示例:
//构造函数
class Person{
constructor(name){
this.name = name
}
}
const ming = new Person('明毅') // 生成person实例
console.log(Person instanceof Function) // true
console.log(Person instanceof Object) // true
console.log(ming instanceof Person) // true