返回

原型链:JS 基础的异世界之旅

前端

灵魂的原型对象:prototype 属性

在异世界里,每个灵魂都有其独特的原型。这原型决定了灵魂的基本属性,如力量、智慧、敏捷等。而在 JavaScript 中,每个对象也有其独特的原型,称为 prototype。原型是对象的灵魂,它定义了对象的属性和方法。

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

const person1 = new Person('Alice');

console.log(person1.name); // "Alice"

Person 函数中的 this 指向正在创建的对象。当调用 new Person('Alice') 时,this 将指向 person1 对象。因此,person1 对象的 name 属性被设置为 'Alice'。

对象的 prototype 属性指向其构造函数的 prototype 属性。因此,person1.prototype 等同于 Person.prototype。

console.log(person1.prototype); // Person {}

Person.prototype 对象定义了所有 Person 对象共有的属性和方法。例如,我们可以添加一个名为 speak 的方法到 Person.prototype 对象中:

Person.prototype.speak = function() {
  console.log(`My name is ${this.name}`);
};

person1.speak(); // "My name is Alice"

现在,所有 Person 对象都可以调用 speak 方法。这是因为它们都继承了 Person.prototype 对象中的方法。

原型继承:灵魂的传承

在异世界里,灵魂可以通过传承的方式,将属性和能力传递给后代。而在 JavaScript 中,对象也可以通过原型继承的方式,将属性和方法传递给其他对象。

function Student(name, grade) {
  Person.call(this, name);
  this.grade = grade;
}

const student1 = new Student('Bob', 10);

console.log(student1.name); // "Bob"
console.log(student1.grade); // 10
student1.speak(); // "My name is Bob"

Student 函数继承了 Person 函数。这意味着 Student 对象具有 Person 对象的所有属性和方法。此外,Student 对象还具有自己的 grade 属性。

console.log(student1.__proto__); // Person {}
console.log(student1.__proto__.__proto__); // Object {}

student1.proto 属性指向 Student.prototype 对象。而 Student.prototype.proto 属性指向 Object.prototype 对象。Object.prototype 对象是所有 JavaScript 对象的根原型对象。

原型链:灵魂的谱系

原型链是对象的灵魂谱系。它了对象之间的继承关系。在 JavaScript 中,每个对象都有一个原型对象,而这个原型对象又可能具有自己的原型对象,如此一直追溯到根原型对象 Object.prototype。

原型链允许对象访问其原型对象中的属性和方法。例如,student1 对象可以访问 Person.prototype 对象中的 speak 方法,因为 student1.proto 属性指向 Person.prototype 对象。

结语:异世界之旅的启示

通过异世界之旅,我们对 JavaScript 原型链有了更深入的理解。我们了解到原型链是对象之间的继承关系,原型对象定义了对象的属性和方法,对象可以通过原型继承的方式获得原型对象中的属性和方法。

掌握原型链的知识,可以帮助我们更好地理解 JavaScript 的面向对象编程机制。原型链也是 JavaScript 中高级编程技巧的基础,例如,我们可以通过修改原型链来实现对象的组合和委托。