如何使用object.defineproperty

时间:2016-11-25 21:57:23

标签: javascript html defineproperty

我一直在尝试使用object.defineproperty编写getter和setter,但是不能。我一直在尝试这个例子,但它抛出了一个错误,因为没有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);




由于

3 个答案:

答案 0 :(得分:2)

在您的getter中,您正在返回firstName,但尚未定义,因此在Object.defineProperty正上方声明firstName并为其分配fName参数。< / p>

此外,当您声明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);

答案 1 :(得分:2)

您应new向上Person创建Person实例。 如您所见,您可以简单地使用传递给构造函数的变量作为getter和setter 我故意命名构造函数参数以查看所有变量如何一起使用。

在你的getter中,你返回firstNameFromConstructor变量,或者进行一些处理,然后返回它。
在setter中,您可以更改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);

答案 2 :(得分: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);