Наследование в Javascript - прототипирование не в определении-части? - PullRequest
0 голосов
/ 30 июля 2009

Я сейчас переключаюсь с AS3 на JavaScript.
У меня все еще есть проблемы с пониманием концепций наследования.
Я не понимаю, почему следующий код не работает должным образом:

Base = function () {
    this.coolVar = "great";
}  

SmallControl = function () {

    // Inheritance:
    this.prototype = new Base();
    this.prototype.constructor = SmallControl;

    this.prototype.init = function(aMap) {
        console.log('init');
        console.log('coolVar?: ' + this.coolVar);
    }
}  
var foo = new SmallControl();  
//foo.init();         // --> TypeError: foo.init is not a function  
foo.prototype.init(); // --> works

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

Ответы [ 2 ]

1 голос
/ 30 июля 2009

prototype является только значимым свойством конструкторов. Фактический прототип объекта (который доступен в некоторых средах как свойство __proto__, но не является переносимым) устанавливается как атрибут конструктора prototype во время создания объекта. Изменения в прототипе конструктора (добавление свойств к прототипу) будут отражены в живых объектах, но не в том случае, если вы установите Constructor.prototype как совершенно другой объект.

В вашем конструкторе вы устанавливаете атрибут prototype построенного объекта (this). Этот атрибут не имеет особого значения для чего-то, что не является функцией конструктора. Когда вы устанавливаете это вне функции, вы устанавливаете это на функции конструктора.

1 голос
/ 30 июля 2009

Я думаю, вы хотите что-то вроде этого:

// Create the super class
Base = function () {
    this.coolVar = "great";
};  

// Create the new class
SmallControl = function () {
}; 
// Set the prototype of SmallControl to be an instance of Base. 
// This runs the Base constructor _immediately_ which sets up the variable
SmallControl.prototype = new Base();
// Add the init method to the SmallControl class
SmallControl.prototype.init = function(aMap) {
    console.log('init');
    console.log('coolVar?: ' + this.coolVar);
}
// Create an instance of SmallControl    
var foo = new SmallControl();  
foo.init(); 
...