1

object.defineproperty を使用してゲッターとセッターを記述しようとしましたが、できませんでした。この例を試してみましたが、firstName プロパティが定義されていないためエラーがスローされます。

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

ありがとう

4

3 に答える 3

2

Person インスタンスを作成するには、 をnew起動する必要があります。Personご覧のとおり、getter と setter のコンストラクターに渡した変数を単純に使用できます。
すべての変数がどのように連携するかを確認するために、コンストラクターのパラメーターに意図的に名前を付けました。

getter では、firstNameFromConstructor 変数を返すか、何らかの処理を行ってから返します。
セッターで、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);

于 2016-11-25T22:23:21.223 に答える
2

ゲッターでは を返していますがfirstName、まだ定義されていないため、すぐ上で引数をObject.defineProperty宣言firstNameして割り当てます。fName

また、 p1 を宣言するときにnew演算子を使用して、コンストラクターが機能し、プロパティpersonに割り当てられるようにします。"xyz"firstName

だから、これを試してください:

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

于 2016-11-25T22:16:33.577 に答える
0

インスタンス化後に取得/設定できるように、コンストラクターに渡す引数への参照を保存する必要があります。

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);
于 2016-11-25T22:07:55.063 に答える