Наследование прототипов JavaScript и конструкторы - PullRequest
1 голос
/ 06 января 2012

Учитывая следующий пример:

function A(obj) {
}

B.prototype = new A;
B.prototype.constructor = B;

function B(obj) {
    A.call(this, obj);
}

где B должен наследовать прототип от A. Является ли этот код правильным? Почему при синтаксическом анализе скрипта функция A вызывается один раз, без объявления какого-либо экземпляра из A или B? Это из-за следующей линии?

B.prototype = new A;

Если это так, то как B может наследовать A без вызова функции A в определении.

1 Ответ

4 голосов
/ 06 января 2012

Вы можете избежать повторного вызова A, если используете Object.create

B.prototype = Object.create(A.prototype)

Object.create создает новый объект, у которого задан параметр в качестве прототипа (фактический прототип, а не свойство "prototype").Его нет в старых браузерах (IE <8, FF <4), но вы можете (для наших целей) создать свою собственную версию, если хотите.Основная идея состоит в том, чтобы точно создать версию <code>A, которая ничего не делает (и поэтому может быть вызвана без нежелательных побочных эффектов)

if(!Object.create){
    Object.create = function(proto){
        var F = function(){};
        F.prototype = proto;
        return new F(); //BTW, always use parenthesis when calling new. It looks better.
    }
}

Еще одна вещь, которую вы можете сделать, это никогда не помещать логику в функцию конструктора и вместо этогопоместите его в отдельный init метод, который должен быть вызван впоследствии.

...