2016-11-25 12 views
1

object.definepropertyを使用してgetterとsetterを作成しようとしましたが、この例を試していますが、firstNameプロパティが定義されていないためエラーが発生します。誰かが私にあなたが/トンに設定を取得できるように、あなたは、コンストラクタに渡す引数への参照を保存する必要があり、このobject.definepropertyを使用してjavascriptでゲッターとセッターを定義する方法

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

おかげ

+0

?うーん、あなたはしない。どのように値を渡すことなく、その値を渡すことを期待していますか? ;-) –

+0

私の考えは、fName値を持つべきpersonオブジェクトのfirstNameプロパティを作成することです – Geeky

+0

私はそれを行う方法を見つけることができませんでした – Geeky

答えて

2

ので、これを試してみてください。 ご覧のとおり、ゲッターとセッターのコンストラクターに渡した変数をそのまま使用することができます。
私は、コンストラクタのパラメータに意図的に名前を付けて、すべての変数がどのように一緒に再生されているかを確認しました。

getterでは、firstNameFromConstructor変数を戻すか、何らかの処理を行ってから戻します。
セッターでは、firstNameFromConstructor変数の値を変更できます。あなたは `fName`と` lName`を使用しない

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

これは[this mdn page](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Custom_Setters_and_Getters)に基づいています。 – sniels

0

を助けてくださいすることができますインスタンス化後の裾。その右Object.definePropertyfirstNameを宣言し、それにfName引数を割り当てるの上、ごゲッターで

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

これはセッターにのみ適用されます。ゲッターは単独で使用する場合はこれを必要としません。 –

2

あなたはfirstNameを返しているが、それはまだ定義されていません。

また、p1を宣言するときにnew演算子を使用すると、personコンストラクタが動作し、"xyz"firstNameプロパティに割り当てられます。あなたはPersonインスタンスを作成するためにあなたのPersonnewすべき

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

関連する問題