Javascript Object.defineProperty 属性与方法同名
2017-11-06
335
我是 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...
2个回答
您正在定义
Object.parent
来调用自身,这是一个无限递归循环。
jQuery 定义函数来获取属性的原因是它在运行时使用较旧的编码样式计算动态值(getter 和 setter 仅存在于
ES5.1 规范
)。也许您可以做的是为这些属性创建快捷方式(
Object.prototype.par
而不是
parent
),但恕我直言,没有为此付出任何努力。
FrontTheMachine
2017-11-06
此处 this.parent() 是递归调用函数。因此请为您定义的函数指定其他名称,例如 getparent
Object.defineProperty($.fn,"getparent",
将其调用为
$("#foo").getparent
karthik reddy
2017-11-06