6

我正在研究 Javascript 中的继承概念,我正在查看的教程使用以下代码:

// 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;

我的问题是,为什么需要同时调用父构造函数,Person.call(this)并将Student原型设置为等于一个新Person对象(即Student.prototype = new Person();)?

4

2 回答 2

5

有两个不同的问题需要处理。

首先是确保新Student对象继承自Person对象。这就是你这样做的原因Student.prototype = new Person()。这使得Student.prototypea PersonsoStudent对象将继承该对象继承的任何内容(从Person.prototype

第二个是将Person构造函数中的任何行为应用于任何新Student对象。这就是你这样做的原因Person.call(this)。如果Person构造函数没有任何修改新对象的代码,这在技术上是不需要的,但这样做仍然是一个好主意,以防您Person稍后添加一些代码。


旁注,在设置继承时,最好这样做:

Student.prototype = Object.create(Person.prototype)

...和垫片(Object.create如果需要)。这样,您实际上不需要调用Person构造函数来获取继承自Person.prototype. 同样,有时不是问题,但有时在构造函数中会出现在设置继承时不希望出现的副作用。

于 2013-04-05T21:23:07.393 回答
0

在做了一些测试之后,据我了解,对象的原型和在其定义函数中所做的属性声明是分开的。但是,当构造一个新对象时,构造函数将从定义函数和正在创建的对象的原型中提取属性。

例如,

function Person()
{

    this.name = "james";
    this.age = "shfifty-five";


}

console.log(Person.prototype.name); // prints "undefined", showing how declaring function Person() and Person.prototype are separate.

Person.prototype.gender = "male";

var human = new Person();

console.log(human.name); // prints "james", showing how the object took properties from declaring function Person().
console.log(human.gender); // prints "male", showing how the object took properties from object prototype Person.prototype.


function Student()
{

    this.gpa = 4.00;


}



Student.prototype = new Person();

Student.prototype.constructor = Student;


var myStudent = new Student();

console.log(myStudent.name); // prints "james"
console.log(myStudent.gender); // prints "male"
/*from above two lines, inheritance holds even though 1) Person() defining function was not called inside Student() defining function
and 2) Person() defining function declares properties of Person object.*/
console.log(myStudent.gpa); // prints "4"

如您所见,在这种情况下,定义函数 Person 确实改变了其对象的属性。但是仍然没有必要在 Student 的构造函数中调用 Person 函数,因为new Person()构造函数将从两者Person.prototypefunction Person()定义函数中提取属性。

于 2013-04-06T19:01:48.867 回答