JavaScript -- 原型和原型链

75 阅读2分钟

JavaScript中的原型(prototype)和原型链(prototype chain)是面向对象编程中重要的概念,用于实现继承和对象之间的关联。

  1. 原型(prototype):

    • 在JavaScript中,每个对象都有一个原型。原型是一个对象,它包含可以在实例对象中共享的属性和方法。
    • 对象可以通过构造函数创建,而构造函数又有一个原型对象。通过原型,所有通过该构造函数创建的实例对象可以访问相同的属性和方法。
    • 原型可以看作是一个对象的模板,实例对象可以继承原型对象的属性和方法。

    示例:

    
    function Person(name) {
      this.name = name;
    }
    
    // 添加一个方法到Person的原型
    Person.prototype.sayHello = function() {
      console.log("Hello, " + this.name + "!");
    };
    
    // 创建一个Person的实例
    var person1 = new Person("John");
    
    // 通过原型链访问原型上的方法
    person1.sayHello(); // 输出: Hello, John!
    
  2. 原型链(prototype chain):

原型链是由对象的原型形成的链状结构,用于在查找属性或方法时沿着这个链进行搜索。当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript引擎会沿着原型链向上查找,直到找到匹配的属性或方法或者到达原型链的末端(即Object.prototype)。

例如:


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

Animal.prototype.eat = function() {
  console.log(this.name + ' is eating.');
};

function Dog(name, breed) {
  Animal.call(this, name);
  this.breed = breed;
}

// 继承 Animal 的原型
Dog.prototype = Object.create(Animal.prototype);

Dog.prototype.bark = function() {
  console.log(this.name + ' is barking.');
};

var myDog = new Dog('Buddy', 'Golden Retriever');
myDog.bark(); // 输出:Buddy is barking.
myDog.eat();  // 输出:Buddy is eating.

在这个例子中,myDog 对象通过原型链继承了 Animal 的方法,并且 Dog 的原型是通过 Object.create(Animal.prototype) 来创建的,从而建立了原型链。

总结起来,原型是对象的一个属性,用于指向另一个对象,而原型链是一系列对象的连接,用于在查找属性或方法时进行继承。这种原型链的机制使得 JavaScript 中的对象能够共享属性和方法,实现了简单而有效的继承。