Javascript 将ownProperty对象添加到对象时出错';s原型

Javascript 将ownProperty对象添加到对象时出错';s原型,javascript,prototype,Javascript,Prototype,我正在使用向对象添加一些属性。当我添加到对象的属性时,它正常工作。但是当我将它添加到对象的原型中时,我得到了一个太多的递归错误 var obj={}; Object.defineProperty(obj.\uuuuu proto\uuuuuu,'键'{ 可枚举:正确, get:()=>{return key}, 设置:(值)=>{ 如果(类型(值)=‘数字’){ 键=2*值; } } }); obj.key=3; 控制台日志(对象键)这是因为通过在对象的原型上定义属性,每个对象都获得了gett

我正在使用向对象添加一些属性。当我添加到对象的属性时,它正常工作。但是当我将它添加到对象的原型中时,我得到了一个
太多的递归
错误

var obj={};
Object.defineProperty(obj.\uuuuu proto\uuuuuu,'键'{
可枚举:正确,
get:()=>{return key},
设置:(值)=>{
如果(类型(值)=‘数字’){
键=2*值;
}
}
});
obj.key=3;

控制台日志(对象键)这是因为通过在对象的原型上定义属性,每个对象都获得了getter/setter。JS中的所有东西都是一个对象,这意味着
window
也将有一个
setter/getter

在setter/getter函数中,只需使用
。由于未明确定义
变量,因此将使用在
窗口
上定义的变量。这就是导致递归的原因

您执行
obj.key=3
,它调用setter,setter执行
window.key=2*value
,setter执行
window.key=2*value
。以此类推,直到达到最大调用堆栈

不要在原型上添加一些东西,除非你想在每个实例上都添加

由于您使用的是arrow函数,因此没有绑定到setter/getter调用的
this
,因此您无法知道与哪个实例对象交互

相反,不要扩展对象的原型,创建自己的原型,并设置/获取正确的变量/属性

例如,使用实际的构造函数,并将箭头函数更改为正则函数表达式。这将使setter/getter能够获得对象的实例引用。然后,您将需要某种方法来跟踪哪个键属于哪个实例。如果不需要隐藏这些变量,只需使用前缀命名属性,如:
this.\u key=2*value否则,如果您想保持它们的私密性,可以使用s

函数YourClass(){};
(功能(){
var keyMap=newweakmap();
Object.defineProperty(YourClass.prototype,'key'{
可枚举:正确,
get:function(){
返回keyMap.get(这个);
},
设置:函数(值){
if(类型(值)=“编号”){
keyMap.set(这个,2*值);
}
}
});
})();
obj=新的YourClass();
obj.key=3;
控制台日志(对象键);
函数secondClass(){}
//使第二类继承自您的类
secondClass.prototype=Object.create(
YourClass.prototype,
{
“构造函数”:{
对,,
可枚举:false,
可写:对,
价值:二等
}
});
var obj2=新的第二类();
obj2.key=16;

console.log(obj2.key)这是因为通过在对象的原型上定义属性,每个对象都获得了getter/setter。JS中的所有东西都是一个对象,这意味着
window
也将有一个
setter/getter

在setter/getter函数中,只需使用
。由于未明确定义
变量,因此将使用在
窗口
上定义的变量。这就是导致递归的原因

您执行
obj.key=3
,它调用setter,setter执行
window.key=2*value
,setter执行
window.key=2*value
。以此类推,直到达到最大调用堆栈

不要在原型上添加一些东西,除非你想在每个实例上都添加

由于您使用的是arrow函数,因此没有绑定到setter/getter调用的
this
,因此您无法知道与哪个实例对象交互

相反,不要扩展对象的原型,创建自己的原型,并设置/获取正确的变量/属性

例如,使用实际的构造函数,并将箭头函数更改为正则函数表达式。这将使setter/getter能够获得对象的实例引用。然后,您将需要某种方法来跟踪哪个键属于哪个实例。如果不需要隐藏这些变量,只需使用前缀命名属性,如:
this.\u key=2*value否则,如果您想保持它们的私密性,可以使用s

函数YourClass(){};
(功能(){
var keyMap=newweakmap();
Object.defineProperty(YourClass.prototype,'key'{
可枚举:正确,
get:function(){
返回keyMap.get(这个);
},
设置:函数(值){
if(类型(值)=“编号”){
keyMap.set(这个,2*值);
}
}
});
})();
obj=新的YourClass();
obj.key=3;
控制台日志(对象键);
函数secondClass(){}
//使第二类继承自您的类
secondClass.prototype=Object.create(
YourClass.prototype,
{
“构造函数”:{
对,,
可枚举:false,
可写:对,
价值:二等
}
});
var obj2=新的第二类();
obj2.key=16;

console.log(obj2.key)在哪里定义了
?(这很重要)@dandavis,之前没有定义。我使用setter作为初始化。但是,即使我在原型中定义了它,我也会得到同样的错误。你不能在那里定义它,你需要一个名为key的封闭私有变量(如图所示),key在哪里定义?(这很重要)@dandavis,之前没有定义。我使用setter作为初始化。但是,即使我在原型中定义了它,我也会得到同样的错误。你不能在那里定义它,你需要一个名为key的封闭私有变量(如图所示),我需要将它添加到所有将从这个对象继承的对象中,它必须转到原型。你能给出一个工作示例,说明我如何将它添加到原型中而不引起这种递归吗?我想知道为什么全局变量会引起递归问题