返回

剖析原型与原型链的基础与特性

前端

原型的本质

在 JavaScript 中,一切引用类型都是对象,而对象本质上是属性的集合。当我们通过 typeof 来判断类型时,引用类型的判断结果是 functionobject。其中,函数也是对象的一种。

通常,我们是通过函数来创建对象的。而同时函数又是对构造函数的引用。因此,我们可以通过构造函数来创建对象,也可以通过函数来创建对象。

例如,我们可以通过以下方式创建对象:

const obj = new Object(); // 通过构造函数创建对象
const obj = {}; // 通过函数创建对象

这两种方式创建的对象本质上是一样的,都是一个属性的集合。

原型链的结构

每个对象都有一个原型对象,原型对象也是一个对象。原型对象也有自己的原型对象,如此层层向上,直到遇到 null,原型链就结束了。

我们可以通过 Object.getPrototypeOf() 方法来获取对象的原型对象。例如:

const obj = {};
const proto = Object.getPrototypeOf(obj);
console.log(proto); // {}

输出结果是一个空对象,这是因为 Object 构造函数的原型对象是一个空对象。

我们可以通过 Object.prototype 属性来获取 Object 构造函数的原型对象。例如:

const proto = Object.prototype;
console.log(proto); // {}

输出结果也是一个空对象。

原型链的作用

原型链的作用在于实现了继承。当我们通过构造函数创建对象时,该对象就会继承构造函数的原型对象上的所有属性和方法。例如:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const person = new Person('John');
person.sayHello(); // Hello, my name is John

在这个示例中,Person 构造函数的原型对象上有一个 sayHello 方法,当我们通过 new 运算符创建 person 对象时,该对象就会继承 sayHello 方法。

原型链还实现了多态。多态是指对象可以以不同的方式响应相同的操作。例如,我们可以通过 console.log() 方法输出任意对象,而 console.log() 方法会根据对象的类型以不同的方式格式化输出对象。

原型链还实现了封装。封装是指将对象的属性和方法隐藏起来,只暴露给需要使用它们的对象。例如,我们可以通过 Object.freeze() 方法冻结对象,这样该对象的所有属性和方法都无法被修改。

总结

原型与原型链是 JavaScript 中重要的概念,对于理解 JavaScript 的面向对象编程至关重要。原型是对象的属性的集合,原型链是对象的原型对象链。原型链的作用在于实现了继承、多态和封装。