JS之原型和原型链

143 阅读3分钟

原型和原型链

一、前言

以前有花时间去学习这方面的知识,但没有及时做笔记总结,导致工作过后就忘的一干二净了。 趁有空余时间,把这方面的知识梳理一下,做成文章,也方便以后的温习。 这方面也是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__里寻找

1.jpg

下面看下代码示例:

// 创建原型
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),就结束。这个逐级往上找的过程,形成了链式,就称为'原型链'。

如下图所示:

617cba5609138ffa05000273.jpg

五、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

注 : 自己学习整理,如果有不对的地方,还请多多指教,谢谢大家 ~!