JS原型模式|青训营笔记

79 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第3天,今天的笔记主要记录一下JS的原型模式。

一、构造函数

构造函数用于创建特定类型对象。像Object和Array这样的原生构造函数,运行时可以直接在执行环境中使用。例如:

function Person(name, age) {
   	this.name = name;
   	this.age = age;
    this.species = '人类';
    this.say = function () {
        console.log("Hello");
    }
}

二、原型模式

每个函数都会创建一个prototype属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。实际上,这个对象就是通过调用构造函数创建的对象的原型。使用原型对象的好处是,它上面定义的属性和方法可以被对象实例共享。原来在构造函数中直接赋值的值,可以直接赋值给他们的原型。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.species = '人类';
Person.prototype.say = function () {
    console.log("Hello");
}

let per1 = new Person('xiaoming', 20);
let per2 = new Person('xiaohong', 19);

console.log(per1.species); // 人类 
console.log(per2.species); // 人类

per1.say(); // Hello
per2.say(); // Hello

三、原型链

说原型链之前,先来了解两个概念:

  1. 显示原型 显示原型就是利用prototype属性查找原型,只是这个是函数类型数据的属性

  2. 隐式原型 隐式原型是利用__proto__属性查找原型,这个属性指向当前对象的构造函数的原型对象,这个属性是对象类型数据的属性,所以可以在实例对象上面使用:

console.log(per1.__proto__ === Person.prototype); // true 
console.log(per2.__proto__ === Person.prototype); // true

根据上面,就可以得出constructor、prototype和__proto__之间的关系了:

image.png

每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例呢?那意味着这个原型本身有一个内部指针指向另一个原型。这样就形成了原型链。