我是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,这在另一种情况下是相反的?谢谢!
答案 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