如何使用object.defineproperty在javascript中定义getter和setter
我一直在尝试使用object.defineproperty编写getter和setter,但未能完成。我一直在尝试此示例,但由于未定义firstName属性,它引发了一个错误。是否有人可以帮助我解决此问题如何使用object.defineproperty在javascript中定义getter和setter,javascript,html,defineproperty,Javascript,Html,Defineproperty,我一直在尝试使用object.defineproperty编写getter和setter,但未能完成。我一直在尝试此示例,但由于未定义firstName属性,它引发了一个错误。是否有人可以帮助我解决此问题 职能人员(fName,lName){ Object.defineProperty(这是“firstName”{ get:function(){return firstName;}, set:function(newValue){firstName=newValue;} }); } 变量p1=
职能人员(fName,lName){
Object.defineProperty(这是“firstName”{
get:function(){return firstName;},
set:function(newValue){firstName=newValue;}
});
}
变量p1=人(“xyz”、“abc”);
console.log(p1.firstName)代码>您需要保存对传递到构造函数中的参数的引用,以便在实例化后获取/设置它们
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);
您需要保存对传递到构造函数中的参数的引用,以便在实例化后获取/设置它们
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
,但它尚未定义,因此就在对象的正上方。定义属性声明firstName
并为其指定fName
参数
此外,当您声明p1时,请使用new
运算符,以便您的人员
构造函数工作并将xyz
分配给firstName
属性
那么,试试这个:
职能人员(fName,lName){
var firstName=fName;
Object.defineProperty(这是“firstName”{
get:function(){return firstName;},
set:function(newValue){firstName=newValue;}
});
}
风险值p1=新人(“xyz”、“abc”);
console.log(p1.firstName);
p1.firstName=“abc”;
console.log(p1.firstName)
在getter中,您返回的是firstName
,但它还没有定义,所以就在对象的正上方。defineProperty
声明firstName
并将fName
参数指定给它
此外,当您声明p1时,请使用new
运算符,以便您的人员
构造函数工作并将xyz
分配给firstName
属性
那么,试试这个:
职能人员(fName,lName){
var firstName=fName;
Object.defineProperty(这是“firstName”{
get:function(){return firstName;},
set:function(newValue){firstName=newValue;}
});
}
风险值p1=新人(“xyz”、“abc”);
console.log(p1.firstName);
p1.firstName=“abc”;
console.log(p1.firstName)
您应该new
启动您的Person
来创建Person实例。
如您所见,您可以简单地使用传递到getter和setter的构造函数中的变量。
我特意命名了构造函数参数,以查看所有变量如何协同工作
在getter中,返回firstNameFromConstructor变量,或者进行一些处理,然后返回它。
在setter中,可以更改firstNameFromConstructor变量的值
函数人(firstNameFromConstructor,lastNameFromConstructor){
Object.defineProperty(这是“firstName”{
get:function(){return firstNameFromConstructor;},
set:function(newFirstName){firstNameFromConstructor=newFirstName;}
});
Object.defineProperty(此“lastName”{
get:function(){return lastNameFromConstructor;},
set:function(newLastName){lastNameFromConstructor=newLastName;}
});
}
风险值p1=新人(“xyz”、“abc”);
console.log(p1.firstName);
p1.firstName='zyx'
console.log(p1.firstName)
您应该new
启动您的Person
来创建Person实例。
如您所见,您可以简单地使用传递到getter和setter的构造函数中的变量。
我特意命名了构造函数参数,以查看所有变量如何协同工作
在getter中,返回firstNameFromConstructor变量,或者进行一些处理,然后返回它。
在setter中,可以更改firstNameFromConstructor变量的值
函数人(firstNameFromConstructor,lastNameFromConstructor){
Object.defineProperty(这是“firstName”{
get:function(){return firstNameFromConstructor;},
set:function(newFirstName){firstNameFromConstructor=newFirstName;}
});
Object.defineProperty(此“lastName”{
get:function(){return lastNameFromConstructor;},
set:function(newLastName){lastNameFromConstructor=newLastName;}
});
}
风险值p1=新人(“xyz”、“abc”);
console.log(p1.firstName);
p1.firstName='zyx'
console.log(p1.firstName)代码>这仅适用于setter。如果单独使用,getter不需要它。这只适用于setter。如果单独使用,getter不需要这个。在哪里使用fName
和lName
?嗯,你没有。您希望如何在不传递值的情况下传递值?;-)我的想法是在person对象中创建一个firstName属性,该属性应该具有fName值。我找不到一种方法来解决这个问题,错误很明显。您没有在任何地方定义firstName
变量,因此返回firstName
抛出,并且firstName=newValue
以草率模式创建全局属性,并以严格模式抛出。您在何处使用fName
和lName
?嗯,你没有。您希望如何在不传递值的情况下传递值?;-)我的想法是在person对象中创建一个firstName属性,该属性应该具有fName值。我找不到一种方法来解决这个问题,错误很明显。您没有在任何地方定义firstName
变量,因此return firstName
抛出,并且firstName=newValue
在sloppy模式下创建全局属性,并在strict模式下抛出。这基于。这基于。