开发者问题收集

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