如何正确地使一个构造函数的prototype属性继承其原始的prototype属性?

时间:2016-10-15 16:05:38

标签: javascript inheritance prototype

我是javascript编程的新手。最近我遇到了一个让我在javascript之旅中迷惑的问题。 我想创建一个Teacher()构造函数,它继承Person()构造函数中的所有成员。

首先,我创建Person(),如下所示

1.000

其次我从Person()创建Teacher()。

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

    Person.prototype.greeting = function() {
      alert('Hi! I\'m ' + this.name + '.');
    };

问题在于:

当我尝试设置Teacher()的原型时,让我感到困惑的是,以下两种做法似乎是相同的。但是我认为它们必须有一些区别。 我先写了如下:

    function Teacher(name){
      Person.call(this,name);
    };

在我写完之后,我认为Teacher.prototype将等于Person.prototype,这被证明是错误的:

    Teacher.prototype = Object.create(Person.prototype);

但是,TeacherA(Teacher()的实例)成功地从Person()继承了greeting方法:

    Teacher.prototype === Person.prototype;//=>false

然后我尝试将代码更改为以下内容,这使得Teacher()的prototype属性等于Person()的prototype属性:

    var teacherA = new Teacher();
    teacherA.name = 'Kyle';
    teacherA.greeting();//=>Hi!I'm Kyle.

当然,另一个Teacher()实例teacherB也从Person()继承了问候方法:

    Teacher.prototype = Person.prototype;
    Teacher.prototype === Person.prototype;//=>true

任何人都可以告诉我为什么这两种做法都成功继承了,但是在两种情况中的一种情况下,Teacher.prototype不等于Person.prototype,这在另一种情况下是相反的?谢谢!

1 个答案:

答案 0 :(得分:0)

  

在我写完之后,我认为Teacher.prototype将等于   Person.prototype,证明是错误的

是的,因为当你使用Object.create时,它会创建一个原型为Person.prototype的新对象。这就是发生的事情:

var mediator = {};
Object.setPrototypeOf(mediator, Person.prototype);
Teacher.prototype = mediator

所以最终的原型链是这样的:

Teacher.prototype -> middle.__proto__ -> Person.prototype
  

然而,TeacherA(Teacher()的实例继承了greeting方法   来自Person()成功:

是的,因为正如我上面所示,仍然可以从Person.prototype到达Teacher.prototype

  

然后我尝试将我的代码更改为以下,这使得Teacher()成为了   prototype属性等于Person()的原型属性:

这不应该这样做,因为你可能想要将方法添加到不应该从Person访问的Teacher原型中。但是通过这样做,如果你向Teacher原型添加任何方法,它将可以从Person的实例访问。所以,这样做之后:

Teacher.prototype = Person.prototype;

var teacher = new Teacher();
var person = new Person();

// let's add method to child Person
Person.prototype.childMethod = function() {};

// the parent can still access it
person.childMethod(); // works OK