我是js world的新手,并且发现jquery声明了很多属性作为让我感到非常不舒服的方法。比如$("#foo").parent()
我觉得应该是属性。
我知道js也可以定义属性,所以我想尝试将这些方法重新定义为相应的属性。
Object.defineProperty($.fn,"parent",
{
get:function () {
return this.parent()
},
configurable:false,
enumerable:true
});
然后我可以像$("#foo").parent
但我得到了一个stackoverflow
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 ......
答案 0 :(得分:1)
您正在定义Object.parent
来称呼自己,这是一个无限的递归循环。
jQuery定义函数以获取属性的原因是它使用旧的编码风格(运算符和设置器仅存在于ES5.1 specs)在运行时计算动态值。也许您可以做的是为这些属性创建快捷方式(Object.prototype.par
而不是parent
),但是没有努力去做恕我直言。
答案 1 :(得分:0)
这里this.parent()是递归调用函数。所以给你定义的函数提供一些其他名称,例如getparent Object.defineProperty($.fn,"getparent",
,将其称为$("#foo").getparent