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

由于
答案 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);