Подтвердить что ты не робот

Функция расширения наследования JavaScript

У меня возникли проблемы с пониманием предложения IF в конце этой функции из шаблонов проектирования JavaScript:

function extend(subClass, superClass) {
    var F = function() {};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;

    subClass.superclass = superClass.prototype;
    if(superClass.prototype.constructor == Object.prototype.constructor) {
        superClass.prototype.constructor = superClass;
    }
}

В книге объясняется, что эти строки гарантируют, что атрибут конструктора суперкласса правильно установлен, даже если суперкласс является самим классом Object. Тем не менее, если я опустил эти три строки и сделаю следующее:

function SubClass() {};
extend(SubClass, Object);

alert(Object.prototype.constructor == Object);

Предупреждение говорит "true", что означает, что конструктор суперкласса задан правильно даже без трех последних строк. При каких условиях этот оператор IF делает что-то полезное?

Спасибо.

4b9b3361

Ответ 1

Проблема, которую избегают эти две строки, обычно создается при замене свойства prototype функции конструктора, например:

function Foo () {};
Foo.prototype = {
  bar: 'baz'
};

var foo = new Foo();
foo.constructor === Object; // true, but `constructor` should refer to Foo

Когда объекты объектов создаются, свойство prototype инициализируется новым объектом, который содержит свойство constructor, которое ссылается на самой функции, например:

function Bar () {};
var bar = new Bar();
bar.constructor === Bar; // true

При замене свойства prototype другим объектом этот объект имеет собственное свойство constructor, обычно унаследованное от другого конструктора, или от Object.prototype.

var newObj = {};
newObj.constructor === Object;

Рекомендуемые статьи: