我正在阅读 Mozilla Developer Network 的 Introduction to Object-Oriented JavaScript,是时候在开始使用 node.js 之前学习如此严肃的 Javascript。

无论如何,继承的东西对我来说似乎很模糊。从文档中复制并粘贴:

// define the Person Class
function Person() {}

Person.prototype.walk = function(){
  alert ('I am walking!');
};
Person.prototype.sayHello = function(){
  alert ('hello');
};

这很容易,但是 Student 继承会使事情变得复杂。有没有其他人认为以下三个陈述在本质上做同样的事情?

// define the Student class
function Student() {
  // Call the parent constructor
  Person.call(this);
}

// inherit Person
Student.prototype = new Person();

// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

我理解第一个(调用父构造函数),因为它与 Java、PHP 等非常相似。但随后问题就开始了。

为什么需要调用 Student.prototypeStudent.prototype.constructor

需要一个明确的解释。为什么这个代码:

// define the Student class
function Student() {
  // Call the parent constructor
  Person.call(this);
}

var student1 = new Student();

还不足以让继承发挥作用吗?

编辑 :关于构造函数的事情,已经回答了 here

最佳答案

这不起作用:

function Student() {
  Person.call(this);
}

var student1 = new Student();

因为 Person 的原型(prototype)属性在 Student 实例上不可用。 Person.call(this) 仅调用具有特定 Person 值(即 this 实例)的 Student。但是 Person 函数是完全空的——所以在这里它什么都不做。除了无用的 Student 调用之外,PersonPerson 之间没有任何关系。

要获得 Person 的功能,需要进行 .prototype 赋值。

前:

<a Student instance>
  its prototype: Student.prototype, with all student functions
    its prototype: Object.prototype

后:

<a Student instance>
  its prototype: <a Person instance>, with all student functions if you add them
    its prototype: Person.prototype, with all person functions
      its prototype: Object.prototype

关于javascript - Javascript 继承有一些我不明白的地方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12217648/

10-16 19:58