说来话长的 Javascript 原型链
时间: 2023-11-17 14:08:33 浏览: 77
Javascript 原型链是 Javascript 的一项特性,用于实现继承和属性查找。
在 Javascript 中,每个对象都有一个内部属性 `[[Prototype]]`,也称为原型。这个原型可以是另一个对象,它充当了当前对象的模板,包含了当前对象没有的属性和方法。如果我们想要访问一个对象中不存在的属性或方法,Javascript 引擎会沿着原型链向上查找,直到找到该属性或方法或者到达原型链的顶端为止。
例如,假设有一个对象 `obj`,它的原型是另一个对象 `proto`,而 `proto` 的原型又是另一个对象 `grandProto`,那么当我们访问 `obj` 中的一个属性时,Javascript 引擎会先在 `obj` 中查找,如果找不到,就去 `proto` 中查找,还找不到就去 `grandProto` 中查找,以此类推,直到找到该属性或者到达原型链的顶端为止。
Javascript 中的原型链是通过 `__proto__` 属性来实现的。每个对象都有一个 `__proto__` 属性,它指向该对象的原型。在 ECMAScript 6 中,我们可以使用 `Object.getPrototypeOf()` 方法获取一个对象的原型,而在早期版本的 Javascript 中,则可以通过 `__proto__` 属性来获取。
除了 `__proto__` 属性外,Javascript 还提供了一种创建对象的方式,即构造函数。构造函数可以用来创建一个对象,并且可以设置该对象的属性和方法。当我们使用 `new` 关键字调用构造函数时,Javascript 引擎会自动为该对象创建一个 `__proto__` 属性,并将其指向构造函数的 `prototype` 属性。
例如,假设我们有一个构造函数 `Person`,它有一个属性 `name` 和一个方法 `sayHello`:
```
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
}
```
当我们使用 `new` 关键字调用 `Person` 构造函数时,Javascript 引擎会创建一个新的对象,并将其 `__proto__` 属性指向 `Person.prototype`,然后调用构造函数,将 `name` 属性设置为传入的参数。最后返回该对象:
```
var person = new Person('John');
```
此时 `person.__proto__ === Person.prototype`,而 `Person.prototype.__proto__ === Object.prototype`,因此 `person` 对象的原型链可以表示为:
```
person -> Person.prototype -> Object.prototype -> null
```
通过原型链,`person` 对象可以访问到 `Person.prototype` 中定义的 `sayHello` 方法以及 `Object.prototype` 中定义的其他方法和属性。
阅读全文