Все это связано с тем, как наследование работает в JavaScript. Проверьте эту ссылку для подробного объяснения (в основном, constructor
это просто еще одно свойство прототипа).
Редактировать: Кроме того, если вы хотите «настоящее» прототипическое наследование, вы должны использовать какую-то функцию клона, например,
function clone(obj) {
if(typeof obj !== 'undefined') {
arguments.callee.prototype = Object(obj);
return new arguments.callee;
}
}
Тогда вы можете делать такие вещи
function Base() {}
function Sub() {}
Sub.prototype = clone(Base.prototype);
var obj = new Sub;
и вы все равно получите true
два раза на
document.writeln(obj instanceof Sub);
document.writeln(obj instanceof Base);
Разница в вашем решении заключается в том, что Base()
вызываться не будет, а Sub.prototype
будет наследовать только свойства Base.prototype
, а не те, которые установлены в конструкторе.