Наследование в Javascript - прототипирование не в определении части?

StackOverflow https://stackoverflow.com/questions/1205385

Вопрос

В настоящее время я переключаюсь с 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 " все будет работать нормально ... но я этого не понимаю.

Это было полезно?

Решение

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

// 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(); 

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top