2010-02-20 10 views
2

Функция A() { this.myProp = document.createElement ("div"); }Javascript subclassing and createElement

function B(id) { 
    this.myProp.id = id; 
    document.body.appendChild(this.myProp); } 

B.prototype = new A(); 

window.onload = function() { 
    new B("hello"); 
    new B("goodbye"); } 

Что происходит, здесь я получаю один div с id «до свидания». Я бы хотел, чтобы два div с указанными идентификаторами.

Я смог исправить эту проблему, создав метод «A», который создает элемент.

Как я могу исправить это, не используя метод?

+0

Как выглядит код, который не работает? –

+0

http://willat8.freehostia.com/int/custom.js стартовая строка 115, конечная строка 337 – willat8

ответ

1

Вы должны вызвать конструктор A() при создании new B():

function A() { 
    this.myProp = document.createElement("div"); 
} 

function B(id) { 
    A.call(this); // !!! 
    this.myProp.id = id; 
    document.body.appendChild(this.myProp); 
} 

Если вы хотите B экземпляров наследовать от A.prototype, не устанавливайте B.prototype к A например, но использовать Object.create() - или обычая реализация для устаревших браузеров - во избежание вызова конструктора:

var clone = Object.create || (function() { 
    function Dummy() {} 
    return function(obj) { 
     Dummy.prototype = obj; 
     return new Dummy; 
    }; 
})(); 

B.prototype = clone(A.prototype); 
+0

Спасибо за полезный ответ. Я не совсем понимаю, почему вы используете метод Object.create(). Сможете ли вы это объяснить? – willat8

+0

@ willat8: функции-конструкторы используются для создания и инициализации экземпляров, то есть распределения ресурсов, необходимых экземпляру, но которые являются излишними в объекте прототипа; в вашем случае примером для такого ресурса будет элемент 'myProp'; в других случаях последствия могут быть более серьезными: например, рассмотреть объект, который регистрирует себя как прослушиватель событий при инициализации; вы хотите, чтобы объект-прототип подкласса делал это? – Christoph

+0

@ willat8: Или использовать свой код: рассмотрите третий класс 'C', который расширяет' B'; используя 'C.prototype = new B ('foo');' будет означать, что вы добавите 'div' в' document.body', соответствующий объекту прототипа – Christoph

Смежные вопросы