【问题标题】:How to define getters and setters in javascript using object.defineproperty如何使用 object.defineproperty 在 javascript 中定义 getter 和 setter
【发布时间】:2016-11-25 21:57:22
【问题描述】:

我一直在尝试使用 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);

谢谢

【问题讨论】:

  • 你在哪里使用fNamelName?呃,你没有。您如何期望传递一个值而不传递它? ;-)
  • 我的想法是在 person 对象中创建一个 firstName 属性,该属性应该具有 fName 值
  • 找不到我该怎么做的方法
  • 嗯,错误很明显。您没有在任何地方定义 firstName 变量,因此 return firstName 会抛出,firstName=newValue 在草率模式下创建全局属性并在严格模式下抛出。

标签: javascript html defineproperty


【解决方案1】:

您应该 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】:

在您的 getter 中,您将返回 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);

【讨论】:

    【解决方案3】:

    您需要保存对传递给构造函数的参数的引用,以便在实例化后获取/设置它们。

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

    【讨论】:

    • 这仅适用于二传手。如果单独使用,getter 不需要这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多