Javascript Object.defineProperty属性与方法同名
我是js world的新手,发现jquery将许多属性声明为方法,这让我非常不舒服。例如Javascript Object.defineProperty属性与方法同名,javascript,jquery,Javascript,Jquery,我是js world的新手,发现jquery将许多属性声明为方法,这让我非常不舒服。例如$(“#foo”).parent(),我认为这应该是一个属性 Object.defineProperty($.fn,"parent", { get:function () { return this.parent() }, configurable:false, en
$(“#foo”).parent()
,我认为这应该是一个属性
Object.defineProperty($.fn,"parent",
{
get:function () {
return this.parent()
},
configurable:false,
enumerable:true
});
我知道js也可以定义属性,所以我想尝试将这些方法重新定义为相应的属性
Object.defineProperty($.fn,"parent",
{
get:function () {
return this.parent()
},
configurable:false,
enumerable:true
});
然后我可以像这样使用它
但是我有一个堆垛机
jqueryplus.js:180 Uncaught RangeError: Maximum call stack size exceeded
at n.fn.init.get [as parent] (jqueryplus.js:180)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
at n.fn.init.get [as parent] (jqueryplus.js:181)
这里发生了什么事?在我看来,变量/属性和方法应该有可能与我熟悉的其他语言(如c#,kotlin…)中的变量/属性和方法同名。这里的.parent()是递归调用函数。所以给我们定义的函数起一个其他的名字,比如getparent
Object。defineProperty($.fn,“getparent”,
称它为$(“#foo”)。getparent
你定义的是对象。parent
称他自己,这是一个无限递归循环
jQuery定义函数以获取属性的原因是,它在运行时使用一种老式的编码样式(getter和setter仅存在于中)计算动态值。也许您可以为这些属性创建快捷方式(
Object.prototype.par
而不是parent
),但IMHO没有这样做。因为您是新手,所以应该接受新的JS习惯用法,而不是尝试更改它们。请注意,接受一个可选参数,这是getter无法做到的。“变量/属性和方法应该可以有相同的名称”-不,JavaScript不是这样工作的。它们位于同一个“命名空间”中-方法实际上只是普通属性,它们的值是函数对象。这就是为什么你的getter试图获得它自己。我建议你学会将属性作为方法来处理。这是一个相当大的时间浪费,只会产生比解决问题更多的问题。谢谢你的建议