4

我正在阅读来自 Mozilla 开发者网络的面向对象 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.prototype andStudent.prototype.constructor

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

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

var student1 = new Student();

继承还不够吗?

编辑:关于构造函数,这里已经回答

4

2 回答 2

2

这不起作用:

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

var student1 = new Student();

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

要获得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
于 2012-08-31T14:58:44.973 回答
1

如果您使用的是 Node.js,我建议您研究 ECMAScript 5 对象创建方法。MDN 有一个页面在这里可能是一个很好的指南。另请参阅John Resig对新方法的概述。当来自像 Java 这样的经典 OO 语言时,很难理解原型继承。祝你好运!

于 2012-08-31T14:50:06.183 回答