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

标签 javascript inheritance prototype

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

首先,我创建 Person() 如下

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

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

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

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

问题是这样的:

当我尝试设置 Teacher() 的原型(prototype)时,令我困惑的是以下两种做法似乎是相同的。但我认为它们一定有一些区别。 我先这样写:

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

按照上面的写法,我认为Teacher.prototype会等于Person.prototype,事实证明这是错误的:

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

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

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

然后我尝试按如下方式更改代码,使 Teacher() 的原型(prototype)属性等于 Person() 的原型(prototype)属性:

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

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

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

谁能告诉我为什么这两种做法都可以成功继承,但在两种情况之一中 Teacher.prototype 不等于 Person.prototype,而在另一种情况下则相反?谢谢!

最佳答案

After I wrote as above, I think Teacher.prototype would be equal to Person.prototype, which proved to be wrong

是的,因为当您使用Object.create时,它会创建原型(prototype)为Person.prototype的新对象。发生的情况如下:

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

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

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

However, teacherA, the instance of Teacher(), inherits greeting method from Person() successfully:

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

Then I tried to change my code as following, which made Teacher()'s prototype property equal to Person()'s prototype property:

不应该这样做,因为您可能想要向 Teacher 原型(prototype)添加不能从 Person 访问的方法。但是通过这样做,如果您向 Teacher 原型(prototype)添加任何方法,则可以从 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

关于javascript - 如何正确地使一个构造函数的原型(prototype)属性继承其原始的原型(prototype)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40061267/

相关文章:

javascript - Html 用原型(prototype)解码?

javascript - Google Map v3 map 加载事件

javascript - 如何将一个包含数组的对象拆分为多个对象

javascript - 将 SVG 下载为 PNG 图像

javascript - 从 Object 调用 Object.Prototype 中的函数

javascript - 在将函数定义为 Object.prototype 扩展或只是函数之前要考虑什么?

javascript - 如何使用打开 vue-js 模式的可点击组件在 vue-js 中创建 TreeView ?

c++ - 如何在c++中找到几乎被覆盖的函数

java - 在java中初始化final字段的奇怪行为

c++ - 从子类方法访问基类变量