剖析原型与原型链的基础与特性
2023-11-15 04:56:08
原型的本质
在 JavaScript 中,一切引用类型都是对象,而对象本质上是属性的集合。当我们通过 typeof
来判断类型时,引用类型的判断结果是 function
和 object
。其中,函数也是对象的一种。
通常,我们是通过函数来创建对象的。而同时函数又是对构造函数的引用。因此,我们可以通过构造函数来创建对象,也可以通过函数来创建对象。
例如,我们可以通过以下方式创建对象:
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 的面向对象编程至关重要。原型是对象的属性的集合,原型链是对象的原型对象链。原型链的作用在于实现了继承、多态和封装。