有一些关于Javascript继承的东西,我无法理解

时间:2012-08-31 14:41:10

标签: javascript prototype prototype-programming prototypal-inheritance

我正在从Mozilla开发者网络阅读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.prototype Student.prototype.constructor

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

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

var student1 = new Student();

还不足以继承工作吗?

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

2 个答案:

答案 0 :(得分:2)

这不起作用:

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

var student1 = new Student();

因为Person实例上没有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

答案 1 :(得分:1)

如果您正在使用Node.js,我建议您查看用于创建对象的ECMAScript 5方法。 MDN has a page here which might be a good guide。另请参阅新方法的John Resig's overview。当来自像Java这样的经典OO语言时,原型继承很难理解。祝你好运!