Если вы присоединяете все свойства к прототипу (что предпочтительно, по крайней мере для методов),
function Foo() {}
Foo.prototype.foo1 = null;
Foo.prototype.foo2 = function() { return false;};
, тогда достаточно присвоить прототип родительского элемента прототипу дочернего элемента:
function inherit(Child, Parent) {
var Tmp = function(){};
Tmp.prototype = Parent.prototype;
Child.prototype = new Tmp();
Child.prototype.constructor = Child;
}
inherit(Bar, Foo);
Здесь мы использовали промежуточную функцию конструктора, чтобы «разъединить» два прототипа.В противном случае, если вы измените один, вы также измените другой (поскольку они ссылаются на один и тот же объект).Этот способ на самом деле довольно популярен и используется парой библиотек.
Если нет, вам нужно вызвать функцию конструктора родителя внутри дочерней функции конструктора:
function Bar() {
Foo.call(this);
}
Это то, что вывсегда следует делать, чтобы назначить свойства, заданные в функции конструктора, текущему объекту.
Дополнительное замечание на вашем пути:
Bar.prototype = new Foo();
this should работает (также в IE на самом деле), но имеет два основных недостатка:
Все свойства экземпляра , установленные в Foo
, станут свойствами, общими длявсе Bar
экземпляров.
Что если Foo
ожидает некоторые аргументы, доступные только при создании экземпляра Bar
?