Функция расширения наследования 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 делает что-то полезное?
Спасибо.
Ответы
Ответ 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;
Рекомендуемые статьи: