Каково обоснование поведения указателя конструктора в JavaScript? - PullRequest
1 голос
/ 16 января 2009

Учитывая упрощенный сценарий:

function Base() {}
function Child() {}
Child.prototype = new Base;

Интересно, почему экземпляру Child присваивается свойство конструктора Base, а не Child?

Ответы [ 2 ]

4 голосов
/ 16 января 2009

Все это связано с тем, как наследование работает в 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, а не те, которые установлены в конструкторе.

2 голосов
/ 16 января 2009
function Base() {}
//Base.prototype.constructor === Base
function Child() {}
//Child.prototype.constructor === Child;
var b = new Base;
//b.constructor = Base;
Child.prototype = b;
//Child.prototype.constructor === Base

в принципе, любое свойство прототипа становится свойством экземпляра, включая «конструктор»

когда вы переназначаете все свойство прототипа новому объекту, вы заменяете старое свойство конструктора новым.

если вы не хотите, чтобы это происходило, вы должны присваивать свойства объекту-прототипу один за другим, а не назначать все свойство прототипа новому объекту сразу. Или замените старое свойство конструктора позже.

Гораздо лучшая идея: не полагайтесь на свойство конструктора для чего-то важного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...