如何使用 object.defineproperty 在 javascript 中定义 getter 和 setter
How to define getters and setters in javascript using object.defineproperty
我一直在尝试使用 object.defineproperty 编写 getter 和 setter,但不能。我一直在尝试这个例子,但它抛出了一个错误,因为没有 firstName 属性 defined.can someone请帮我这个
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);
谢谢
您需要保存对传递给构造函数的参数的引用,以便在实例化后可以 get/set 它们。
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 中你返回 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);
您应该 new
启动您的 Person
以创建 Person 实例。
如您所见,您可以简单地使用传递给 getter 和 setter.
构造函数的变量
我特意命名构造函数参数以查看所有变量如何协同工作。
在你的 getter 中,你 return firstNameFromConstructor 变量,或者做一些处理然后 return 它。
在您的 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);
我一直在尝试使用 object.defineproperty 编写 getter 和 setter,但不能。我一直在尝试这个例子,但它抛出了一个错误,因为没有 firstName 属性 defined.can someone请帮我这个
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);
谢谢
您需要保存对传递给构造函数的参数的引用,以便在实例化后可以 get/set 它们。
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 中你返回 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);
您应该 new
启动您的 Person
以创建 Person 实例。
如您所见,您可以简单地使用传递给 getter 和 setter.
构造函数的变量
我特意命名构造函数参数以查看所有变量如何协同工作。
在你的 getter 中,你 return firstNameFromConstructor 变量,或者做一些处理然后 return 它。
在您的 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);