2016-11-25 3 views
1

J'ai essayé d'écrire des getters et des setters en utilisant object.defineproperty, mais je n'ai pas pu .J'ai essayé cet exemple mais il génère une erreur car aucune propriété firstName n'est définie. quelqu'un peut-il s'il vous plaît aidez-moi ceComment définir des getters et des setters en javascript en utilisant object.defineproperty

function person(fName, lName) { 
 

 

 
    Object.defineProperty(this, 'firstName', { 
 
    get:function() { return firstName; }, 
 
    set:function(newValue){firstName=newValue;} 
 
}); 
 
} 
 
var p1=person("xyz","abc"); 
 
console.log(p1.firstName);

Merci

+0

Où utilisez-vous '' fName' et lName'? Uhuh, vous ne le faites pas. Comment vous attendez-vous à transmettre une valeur, sans la transmettre? ;-) –

+0

Mon idée est de créer une propriété firstName dans l'objet personne qui devrait avoir la valeur fName – Geeky

+0

n'a pas pu trouver un moyen de comment puis-je le faire – Geeky

Répondre

2

Vous devriez new votre Person pour créer l'instance Personne. Comme vous pouvez le voir, vous pouvez simplement utiliser les variables que vous avez passées dans le constructeur pour votre getter et setter.
J'ai volontairement nommé les paramètres du constructeur pour voir comment toutes les variables jouent ensemble.

Dans votre getter, vous renvoyez la variable firstNameFromConstructor ou vous effectuez un traitement, puis vous le renvoyez.
Dans votre setter, vous pouvez modifier la valeur de la variable firstNameFromConstructor.

function Person(firstNameFromConstructor, lastNameFromConstructor) { 
 
    Object.defineProperty(this, 'firstName', { 
 
     get:function() { return firstNameFromConstructor; }, 
 
     set:function(newFirstName){ firstNameFromConstructor = newFirstName;} 
 
    }); 
 
    Object.defineProperty(this, 'lastName', { 
 
     get:function() { return lastNameFromConstructor; }, 
 
     set:function(newLastName){ lastNameFromConstructor = newLastName;} 
 
    }); 
 
} 
 

 
var p1= new Person("xyz","abc"); 
 
console.log(p1.firstName); 
 
p1.firstName = 'zyx' 
 
console.log(p1.firstName);

+0

Ceci est basé sur [cette page mdn] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Custom_Setters_and_Getters). – sniels

0

vous devez enregistrer les références aux arguments que vous passez dans le constructeur, de sorte que vous pouvez obtenir/ensemble t ourler après l'instanciation.

function person(fName, lName) {  
    Object.defineProperty(this, 'firstName', { 
    get: function() { return this._firstName; }, 
    set: function (newValue) { this._firstName = newValue; } 
    }); 

    Object.defineProperty(this, 'lastName', { 
    get: function() { return this._lastName; }, 
    set: function (newValue) { this._lastName = newValue; } 
    }); 

    this.firstName = fName; 
    this.lastName = lName; 
} 

var p1 = new person("xyz", "abc"); 
console.log(p1.firstName); 
+0

Cela s'applique uniquement au setter. Le getter n'en a pas besoin s'il est utilisé seul. –

2

Dans votre getter vous retournez firstName, mais il est pas encore défini, donc juste au-dessus Object.definePropertyfirstName et déclare assignez l'argument fName à lui.

Aussi, lorsque vous déclarez p1 utiliser l'opérateur new afin que vos person œuvres constructeur et attribue "xyz" à la propriété firstName.

, essayez ceci:

function person(fName, lName) { 
 

 
    var firstName = fName; 
 

 
    Object.defineProperty(this, 'firstName', { 
 

 
    get:function() { return firstName; }, 
 
    set:function(newValue){firstName=newValue;} 
 

 
}); 
 

 
} 
 

 
var p1 = new person("xyz","abc"); 
 

 
console.log(p1.firstName); 
 

 
p1.firstName = "abc"; 
 

 
console.log(p1.firstName);