【问题标题】:How do I correctly make one constructor's prototype property inherit its original's prototype property? [duplicate]如何正确地使一个构造函数的原型属性继承其原始原型属性? [复制]
【发布时间】:2016-10-15 16:05:38
【问题描述】:

我是 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() 的原型时,我很困惑,以下两种做法似乎是相同的。但是,我认为它们必须有一些区别。 我先写如下:

    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() 的原型属性等于 Person() 的原型属性:

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

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

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

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

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    在我上面写完之后,我认为 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() 的 原型属性等于 Person() 的原型属性:

    不应该这样做,因为您可能希望向教师原型添加不应从 Person 访问的方法。但是通过这样做,如果您向 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
    

    【讨论】:

    • 您的回答非常有用。在我学习的时候牢记这一点肯定会让我更好地理解继承。非常感谢。
    • 可能值得一提的是,当你写的时候:
    猜你喜欢
    • 2023-03-16
    • 2016-02-15
    • 2015-01-17
    • 2015-05-15
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2013-03-05
    相关资源
    最近更新 更多