JavaScript中的原型和原型链

梦幻星辰 2020-04-11 ⋅ 16 阅读

在JavaScript中,原型和原型链是理解对象和继承的核心概念。当你创建一个对象时,它拥有一个原型。这个原型可以是另一个对象,它包含了一些共享的属性和方法。在查找属性和方法时,JavaScript会首先在当前对象中查找,如果找不到则会在原型链上继续向上查找。

原型

每个JavaScript对象都有一个原型,它可以是另一个对象或者是null。当你访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会自动去它的原型上查找。原型可以被认为是对象的父对象,它共享了一些属性和方法。

创建对象的几种方式:

  1. 使用对象字面量的方式创建对象:const obj = {}
  2. 使用new关键字和构造函数的方式创建对象:const obj = new Object()
  3. 直接使用Object.create方法创建对象:const obj = Object.create(null)

原型链

原型链是一种继承关系的实现方式。当你访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,它会在原型链上继续向上查找,直到找到或者到达原型链的顶端(null)。

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实例时,它会继承Person.prototype上的方法。

原型和构造函数的关系

在JavaScript中,每个函数都有一个prototype属性,它指向一个对象。当你使用new关键字创建一个对象时,实际上是创建了一个新的空对象,并将该对象的原型指向构造函数的prototype属性。

function Foo() {}
const foo = new Foo();

console.log(Foo.prototype === foo.__proto__); // 输出:true

在上面的例子中,我们创建了一个Foo构造函数,并通过new关键字创建了一个foo实例。我们可以看到,Foo.prototypefoo.__proto__指向的是同一个对象。

原型链的遍历

我们可以使用Object.getPrototypeOf()方法来访问一个对象的原型。通过不断地调用Object.getPrototypeOf()方法,我们可以沿着原型链逐级向上遍历。

function Bar() {}
function Baz() {}

Bar.prototype = Object.create(Baz.prototype);
const bar = new Bar();

console.log(Object.getPrototypeOf(bar)); // 输出:Baz {}
console.log(Object.getPrototypeOf(Object.getPrototypeOf(bar))); // 输出:Object {}

在上面的例子中,我们创建了一个Bar构造函数和一个Baz构造函数。使用Object.create()方法,我们将Bar.prototype的原型设置为Baz.prototype。当我们创建一个bar实例后,可以通过多次调用Object.getPrototypeOf()方法分别访问到BazObject的原型。

结语

原型和原型链是JavaScript中的重要概念,理解它们可以帮助我们更好地理解对象和继承的机制。通过利用原型链,我们可以实现对象之间的属性和方法的共享和继承。希望本文能够帮助你更好地理解JavaScript中的原型和原型链。


全部评论: 0

    我有话说: