Pergunta

Atualmente, estou trocando de AS3 para JavaScript.
Eu ainda tenho alguns problemas com herança-conceitos entendimento.
O que eu não entendo é por que o seguinte código não está funcionando corretamente:

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

Se eu colocar as definições de protótipo fora do "SmallControl" -Function tudo funciona bem ... mas eu não entendo isso.

Foi útil?

Solução

Eu acho que você quer algo parecido com isto:

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

Outras dicas

prototype é apenas uma propriedade significativa de construtores. protótipo real do objeto (que é acessível em alguns ambientes como o __proto__ propriedade, mas isso não é portátil) está definido para ser atributo prototype do construtor no momento que o objeto é construído. Mudanças a protótipo do construtor (adição de propriedades para o protótipo) será refletido em objetos vivos, mas não se você conjunto Constructor.prototype ser um objeto completamente diferente.

Em seu construtor, você está definindo o atributo prototype do objeto construído (this). Este atributo não tem significado especial em algo que não é uma função de construtor. Quando você defini-lo fora da função, você configurá-lo na função de construtor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top