2011-07-22 13 views
9

Tengo el siguiente javascriptcómo acceder a javascript variables de objeto en función prototipo

function person() { 
    //private Variable 
    var fName = null; 
    var lName = null; 

    // assign value to private variable 
    fName = "Dave"; 
    lName = "Smith"; 
}; 

person.prototype.fullName = function() { 
    return this.fName + " " + this.lName; 
}; 

var myPerson = new person(); 
alert(myPerson.fullName()); 

que estoy tratando de conseguir una comprensión de las técnicas orientadas a objetos en Javascript. Tengo un objeto de persona simple y agregué una función a su prototipo.

Esperaba que la alerta tuviera "Dave Smith", sin embargo obtuve "underfined underfined". ¿Por qué es eso y cómo lo soluciono?

Respuesta

10

Lamentablemente no se puede acceder a una variable privada. Entonces, lo cambia a una propiedad pública o agrega métodos getter/setter.

function person() { 

    //private Variable 
    var fName = null; 
    var lName = null; 

    // assign value to private variable 
    fName = "Dave"; 
    lName = "Smith"; 

    this.setFName = function(value){ fName = value; }; 
    this.getFName = function(){ return fName; } 
}; 

ver javascript - accessing private member variables from prototype-defined functions


Pero en realidad esto se parece a lo que busca: Javascript private member on prototype

de ese SO mensaje:

Como está en el ámbito léxico JavaScript, puedes simular esto en un nivel por objeto usando el constru Ctor funciona como un cierre sobre sus 'miembros privados' y define sus métodos en el constructor, pero esto no funcionará para los métodos definidos en la propiedad del prototipo del constructor.

en su caso:

var Person = (function() { 
    var store = {}, guid = 0; 

    function Person() { 
     this.__guid = ++guid; 
     store[guid] = { 
      fName: "Dave", 
      lName: "Smith" 
     }; 
    } 

    Person.prototype.fullName = function() { 
     var privates = store[this.__guid]; 
     return privates.fName + " " + privates.lName; 
    }; 

    Person.prototype.destroy = function() { 
     delete store[this.__guid]; 
    }; 

    return Person; 
})(); 


var myPerson = new Person(); 

alert(myPerson.fullName()); 

// in the end, destroy the instance to avoid a memory leak 
myPerson.destroy(); 

Mira la demostración en vivo en http://jsfiddle.net/roberkules/xurHU/

+0

wil 'Person.prototype.fullName' dentro del 'constructor' se reescribirá en cada construcción? –

+0

@JeroenvanLangen no. – roberkules

2

Estás declarar las variables como local a la función, en lugar de hacerlos parte del objeto. Para ponerlos en la instancia, debes usar 'esto' en el constructor también. Por ejemplo:

function person() { 
    this.fName = 'Dave'; 
    this.lName = 'Smith'; 
} 

person.prototype.fullName = function() { 
    return this.fName + " " + this.lName; 
}; 

var myPerson = new person(); 

alert(myPerson.fullName()); 
0

En el constructor que deberá asignar las variables a this:

this.fName = null; 
    this.lName = null; 

Pero entonces ellos no son privadas. JavaScript no tiene variables privadas como un lenguaje "clásico" orientado a objetos. Las únicas variables "privadas" son las variables locales. Una alternativa a lo anterior es asignar métodos getter/setter al this dentro del constructor.

5

Cuando llama a una persona como un constructor, se crea un nuevo objeto como si fuera new Object() y se le asigna su palabra clave. Es ese objeto que será devuelto por defecto del constructor.

Así que si quieres la instancia que tiene propiedades, es necesario añadirlos a ese objeto:

function Person() { 

    // assign to public properties 
    this.fName = "Dave"; 
    this.lName = "Smith"; 
}; 

Por cierto, por las funciones de convenciones que están destinados a ser llamado como constructores se les da un nombre que empieza con una letra mayúscula.

Cuestiones relacionadas