Javascript Object.defineProperty属性与方法具有相同的名称
我是js世界的新手,并且发现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 …
你正在定义Object.parent
自称,这是一个无限的递归循环。
jQuery定义函数来获取属性的原因是,它使用旧式编码风格(getter和setter只存在于ES5.1规范中 )在运行时计算动态值。 也许你可以做的是创建这些属性( Object.prototype.par
而不是parent
)的快捷方式,但没有努力做这个恕我直言。
这里this.parent()是递归调用函数。 所以给一些其他的名字给你定义的函数,像getparent Object.defineProperty($.fn,"getparent",
把它叫做$("#foo").getparent