Этот тип наследования прототипа часто выполняется следующим образом:
function Parent() {}
function Child() {
Parent.call(this); // call the constructor of the parent
}
var Constr = function() {};
Constr.prototype = Parent.prototype;
Child.prototype = new Constr();
Child.prototype.constructor = Child;
Таким образом, «хитрость» состоит в том, чтобы назначить Parent.prototype
в качестве прототипа для пустой функции и установить новый экземпляр этой функции какпрототип Child
.
Это сделано для того, чтобы расширение Child.prototype
не расширяло Parent.prototype
.
Вы также должны вызвать конструктор родителя в конструкторе дочернего элемента.Я думаю, это та часть, с которой вы боролись.Каждая функция имеет call
[документы] и apply
[документы] метод, который позволяет вам явно установить элемент this
, на который следует ссылаться внутри функции.
В вашем примере это будет выглядеть так:
function Employee(name,title){
this.title=title;
Person.call(this, name);
}
без назначения конструкторасвойство экземпляра.
В вашем примере this.base(name)
работает, потому что, присваивая конструктор свойству экземпляра (и вызывая его таким образом), this
внутри функции ссылается на этот экземпляр.
Существует несколько библиотек, реализующих этот шаблон, например, Библиотека Google Closure :
goog.inherits = function(childCtor, parentCtor) {
/** @constructor */
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;
childCtor.prototype = new tempCtor();
childCtor.prototype.constructor = childCtor;
};