Javascript原型属性描述符

Javascript原型属性描述符,javascript,Javascript,有人能给我解释一下吗?以下内容不应该是属性描述符吗 常数A=函数{ 函数Avalue{ 此值为._值=值; }; A.prototype.value={ 获取函数{返回此._值}, 设置函数值{ console.logthis.\u值; 此值为._值=值; }, }; 返回A; }; var a=新的“测试”; console.loga.value; // { //功能:未定义 // } 这是怎么回事 我对这种语言非常陌生。使用以下语法: 常数A=函数{ 函数Avalue{ 此值为._值=值;

有人能给我解释一下吗?以下内容不应该是属性描述符吗

常数A=函数{ 函数Avalue{ 此值为._值=值; }; A.prototype.value={ 获取函数{返回此._值}, 设置函数值{ console.logthis.\u值; 此值为._值=值; }, }; 返回A; }; var a=新的“测试”; console.loga.value; // { //功能:未定义 // } 这是怎么回事


我对这种语言非常陌生。

使用以下语法:

常数A=函数{ 函数Avalue{ 此值为._值=值; }; A.原型={ 获取值{返回此值。_值}, 设定值{ console.logthis.\u值; 此值为._值=值; }, }; 返回A; };
使用以下语法:

常数A=函数{ 函数Avalue{ 此值为._值=值; }; A.原型={ 获取值{返回此值。_值}, 设定值{ console.logthis.\u值; 此值为._值=值; }, }; 返回A; };
如果您的意图是声明一个类,那么为什么不使用这个类呢

甲级{ 构造函数值{ 此值为._值=值; } 获取值{返回此值。_值} 设定值{ console.logthis.\u值; 这是._值=v; } } var a=新的“测试”;
console.loga.value 如果您的意图是声明一个类,那么为什么不使用这个类呢

甲级{ 构造函数值{ 此值为._值=值; } 获取值{返回此值。_值} 设定值{ console.logthis.\u值; 这是._值=v; } } var a=新的“测试”;
console.loga.value 我的建议是将getter/setter实现从原型转换为构造函数,或者作为此上下文的函数,或者作为实际类的一部分

使用下面的一个实现

... 保持OP的低级构造函数方法。 ... 保持能手和二传手以及。。。 ... 不会被迫破坏已经自然提供的封装。 函数Avalue{ Object.DefineProperty此“值”{ get:函数{ 返回值; }, 设置:函数值{ 返回值=val; }, 可枚举:true }; } 常数a=新的Atest; console.log 'Object.getOwnPropertyDescriptorsa=>', Object.getOwnPropertyDescriptorsa ; console.log'Object.keysa=>',Object.keysa; console.log'a.value:',a.value; console.log'a.value=foo:',a.value=foo; console.log'a.value:',a.value; console.log'a.value=42:',a.value=42; console.log'a.value:',a.value;
.as console wrapper{min height:100%!important;top:0;}我的建议是将getter/setter实现从原型转移到构造函数,或者作为此上下文的函数,或者作为实际类的一部分

使用下面的一个实现

... 保持OP的低级构造函数方法。 ... 保持能手和二传手以及。。。 ... 不会被迫破坏已经自然提供的封装。 函数Avalue{ Object.DefineProperty此“值”{ get:函数{ 返回值; }, 设置:函数值{ 返回值=val; }, 可枚举:true }; } 常数a=新的Atest; console.log 'Object.getOwnPropertyDescriptorsa=>', Object.getOwnPropertyDescriptorsa ; console.log'Object.keysa=>',Object.keysa; console.log'a.value:',a.value; console.log'a.value=foo:',a.value=foo; console.log'a.value:',a.value; console.log'a.value=42:',a.value=42; console.log'a.value:',a.value;
.as控制台包装{最小高度:100%!重要;顶部:0;}第10行:此。_值=v;应该是这样的。_value=value。。。当然,这并不是这种意外行为的唯一原因。@PeterSeliger是的。应该这样。没什么区别。这只是更改变量名称时的一个输入错误。第10行:这。_value=v;应该是这样的。_value=value。。。当然,这并不是这种意外行为的唯一原因。@PeterSeliger是的。应该这样。没什么区别。只是更改变量名时的输入错误出于好奇。。。从上面选择的设计是因为学习/研究/探索,还是类似的东西将成为生产代码的基础?@PeterSeliger所有这些。目前,这是一个学习阶段。欢迎发表详细问题的答案。@PeterSeliger choosen设计有一个非常重要的考虑因素,API有效,我可以阅读。我关心的是_值的公共可访问性,这是惯例规定的私有。通过prototype的getter/setter方法使实例保持精简和干净。但是,只要_值仍然暴露,所有设置器(例如设置器)附加的防护/观察代码都是过时的。根据我的经验,封装/可见性很重要。随着时间的推移,随着复杂性的不断增加、开发人员基础的不断变化等,不受控制的直接访问的机会将成倍增加。暴露在公众面前的东西迟早会被发现的。你知道吗

你需要在这样一个物体上迭代吗?出于好奇。。。从上面选择的设计是因为学习/研究/探索,还是类似的东西将成为生产代码的基础?@PeterSeliger所有这些。目前,这是一个学习阶段。欢迎发表详细问题的答案。@PeterSeliger choosen设计有一个非常重要的考虑因素,API有效,我可以阅读。我关心的是_值的公共可访问性,这是惯例规定的私有。通过prototype的getter/setter方法使实例保持精简和干净。但是,只要_值仍然暴露,所有设置器(例如设置器)附加的防护/观察代码都是过时的。根据我的经验,封装/可见性很重要。随着时间的推移,随着复杂性的不断增加、开发人员基础的不断变化等,不受控制的直接访问的机会将成倍增加。公开的内容迟早会被访问。你是否需要对这样的对象进行迭代?这不仅仅是他们所说的语法糖吗?感谢你的建议,但这确实解决了问题。由于我缺乏这门语言的知识,从我试图理解这里到底发生了什么的经验来看,课堂阻碍了学习的发展。请随意不同意,这只是我的立场,不断变化。我们总是避免魔法数字,拥有更多的魔法很少有助于发现。我的意思是:没有解决问题。当然。。。但是现代语法就是为了这个目的而存在的,它使得做这些事情和阅读做这些事情的代码变得更容易。你自己的答案是,你用一个全新的对象替换对象的原型,这个对象可能在这里工作,但对我来说似乎比较笨重。我会小心的,好的。那你能回答我的问题吗?正确的方法是什么?@pedroodrigues类在js中不仅仅是语法上的suggar,很快它们还具有性能优势。我不想挖掘出相应的源代码来证明这一点。这不仅仅是他们所说的语法糖吗?感谢你的建议,但这确实解决了问题。由于我缺乏这门语言的知识,从我试图理解这里到底发生了什么的经验来看,课堂阻碍了学习的发展。请随意不同意,这只是我的立场,不断变化。我们总是避免魔法数字,拥有更多的魔法很少有助于发现。我的意思是:没有解决问题。当然。。。但是现代语法就是为了这个目的而存在的,它使得做这些事情和阅读做这些事情的代码变得更容易。你自己的答案是,你用一个全新的对象替换对象的原型,这个对象可能在这里工作,但对我来说似乎比较笨重。我会小心的,好的。那你能回答我的问题吗?正确的方法是什么?@pedroodrigues类在js中不仅仅是语法上的suggar,很快它们还具有性能优势。我不想挖掘出相应的源代码来证明这一点。