Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用私有变量和JavaScript中的getter/setter继承类_Javascript_Oop_Inheritance - Fatal编程技术网

用私有变量和JavaScript中的getter/setter继承类

用私有变量和JavaScript中的getter/setter继承类,javascript,oop,inheritance,Javascript,Oop,Inheritance,我做的程序,让你们计算工作(装饰),它使用相当复杂的数据结构,所以决定使用私有变量(类)更好的代码管理。我在多个用例中需要一个类,所以我制作了一个简单的模型,我将根据具体的使用情况进行扩展,但我遇到了问题。我需要扩展的类还使用getter/setter和私有变量,但这些似乎是不可继承的 代码片段 通用模型 类曲面{ #身份证; #姓名; #x; #y; #价值观; #外围; 构造函数({id,name,x,y}){ 这个#id=id; 这个。#name=name; 这个#x=x | | 0; 这

我做的程序,让你们计算工作(装饰),它使用相当复杂的数据结构,所以决定使用私有变量(类)更好的代码管理。我在多个用例中需要一个类,所以我制作了一个简单的模型,我将根据具体的使用情况进行扩展,但我遇到了问题。我需要扩展的类还使用getter/setter和私有变量,但这些似乎是不可继承的

代码片段 通用模型
类曲面{
#身份证;
#姓名;
#x;
#y;
#价值观;
#外围;
构造函数({id,name,x,y}){
这个#id=id;
这个。#name=name;
这个#x=x | | 0;
这个#y=y | | 0;
这个.calculate();
}
计算(){
这个。#值=这个。#x*这个。#y;
这个。#外围=2*(这个。#x+这个。#y);
}
//由于某些原因,这些get/set不会被继承
设置x(值){
这是#x=parseFloat(值| | 0);
这个.calculate();
}
设置y(值){
这是#y=parseFloat(值| | 0);
这个.calculate();
}
获取id(){
将此返回。#id;
}
获取名称(){
返回此项。#名称;
}
得到x(){
返回此。#x.toFixedNumber(2);
}
得到y(){
返回此。#y.toFixedNumber(2);
}
获取值(){
返回此.#值.toFixedNumber(2);
}
获取外围(){
返回此.#外围设备到固定编号(2);
}
toJSON(){
返回{
id:这个,
姓名:这个。#姓名,
x:这个,
y:这个
};
}
}
特定用途
类非典型表面工程扩展了表面{
#身份证;
#姓名;
#x;
#y;
#价值观;
#外围;
#事件发送者;
//必须列入声明
构造函数({id,name,x,y,eventSender}){
super({id,name,x,y});
这是#eventSender=eventSender;
}
设置x(值){
//Super不起作用,所以我重写了这部分代码
控制台日志(“测试x”);
这是#x=parseFloat(值| | 0);
这个.calculate();
此.#eventSender.emit(“计算”);
}
设置y(值){
//它打印出来,然后执行
控制台日志(“测试y”);
这是#y=parseFloat(值| | 0);
这个.calculate();
此.#eventSender.emit(“计算”);
}
获取曲面(){
返回此.value;
}
}
这是Surface类最简单的用例,但它不起作用,所以,现在,我坚持使用当前(我希望这只是暂时的)解决方案多次定义Surface

问题摘要
所以我想知道是否有继承getter/setter的选项。这段代码不会抛出错误,但每次我试图从非典型Surfacework中获取一些值时,它都返回undefined,getter不会执行。另一方面,在非典型surfacework中正确定义的setter会执行,所以我认为getter/setter不会继承。有没有办法继承它们,或者我应该继续使用具有多个定义的代码?

您可以从
AtypicalSurfaceWork
手动调用setter:

const xsuperedescriptor=Object.getOwnPropertyDescriptor(Surface.prototype,“x”),
YSSuperDescriptor=Object.getOwnPropertyDescriptor(Surface.prototype,“y”);
类非典型surfacework扩展了曲面{
#身份证;
#姓名;
#x;
#y;
#价值观;
#外围;
#事件发送者;
//必须列入声明
构造函数({id,name,x,y,eventSender}){
super({id,name,x,y});
这是#eventSender=eventSender;
}
设置x(值){
控制台日志(“测试x”);
xSuperDescriptor.set.call(这个值);
此.#eventSender.emit(“计算”);
}
得到x(){
返回xSuperDescriptor.get.call(this);
}
设置y(值){
//它打印出来,然后执行
控制台日志(“测试y”);
ySuperDescriptor.set.call(这个值);
此.#eventSender.emit(“计算”);
}
得到x(){
返回xSuperDescriptor.get.call(this);
}
获取曲面(){
返回此.value;
}
}

您可以从
非典型表面作业
手动调用设置器:

const xsuperedescriptor=Object.getOwnPropertyDescriptor(Surface.prototype,“x”),
YSSuperDescriptor=Object.getOwnPropertyDescriptor(Surface.prototype,“y”);
类非典型surfacework扩展了曲面{
#身份证;
#姓名;
#x;
#y;
#价值观;
#外围;
#事件发送者;
//必须列入声明
构造函数({id,name,x,y,eventSender}){
super({id,name,x,y});
这是#eventSender=eventSender;
}
设置x(值){
控制台日志(“测试x”);
xSuperDescriptor.set.call(这个值);
此.#eventSender.emit(“计算”);
}
得到x(){
返回xSuperDescriptor.get.call(this);
}
设置y(值){
//它打印出来,然后执行
控制台日志(“测试y”);
ySuperDescriptor.set.call(这个值);
此.#eventSender.emit(“计算”);
}
得到x(){
返回xSuperDescriptor.get.call(this);
}
获取曲面(){
返回此.value;
}
}

因此,当您在
AtypicalSurfaceWork
的实例上设置
x
属性时,您希望同时执行
AtypicalSurfaceWork
Surface
的设置程序。是的,我需要两个设置程序/获取程序。因此,您希望
AtypicalSurfaceWork
Surface
的设置程序在,例如,您在
非典型surfacework
的实例上设置了
x
属性?是的,我需要两个setter/getter。感谢您提供此解决方案,它适用于setter,但我仍然需要找出getter。同样,只需将
替换为
。set
。get
。您也可以使用
.call()
调用它们,但不要传递第二个参数。我已经尝试过了,但这会引发错误,我尝试获取未定义的#x,即使我将其作为参数传递。IDE说这个论点是出乎意料的,所以我两个都试过了,没有一个有效。我试图打印getter,检查它是否存在(它存在),但问题在于“this”,如果需要,我可以提供整个错误输出。是的,现在它可以工作了。谢谢你的时间和对我的帮助