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