Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.defineProperty属性与方法同名_Javascript_Jquery - Fatal编程技术网

Javascript Object.defineProperty属性与方法同名

Javascript Object.defineProperty属性与方法同名,javascript,jquery,Javascript,Jquery,我是js world的新手,发现jquery将许多属性声明为方法,这让我非常不舒服。例如$(“#foo”).parent(),我认为这应该是一个属性 Object.defineProperty($.fn,"parent", { get:function () { return this.parent() }, configurable:false, en

我是js world的新手,发现jquery将许多属性声明为方法,这让我非常不舒服。例如
$(“#foo”).parent()
,我认为这应该是一个属性

Object.defineProperty($.fn,"parent",
        {
            get:function () {
                return this.parent()
            },
            configurable:false,
            enumerable:true
        });
我知道js也可以定义属性,所以我想尝试将这些方法重新定义为相应的属性

Object.defineProperty($.fn,"parent",
        {
            get:function () {
                return this.parent()
            },
            configurable:false,
            enumerable:true
        });
然后我可以像这样使用它

但是我有一个堆垛机

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…)中的变量/属性和方法同名。这里的.parent()是递归调用函数。所以给我们定义的函数起一个其他的名字,比如getparent
Object。defineProperty($.fn,“getparent”,
称它为
$(“#foo”)。getparent
你定义的是
对象。parent
称他自己,这是一个无限递归循环


jQuery定义函数以获取属性的原因是,它在运行时使用一种老式的编码样式(getter和setter仅存在于中)计算动态值。也许您可以为这些属性创建快捷方式(
Object.prototype.par
而不是
parent
),但IMHO没有这样做。

因为您是新手,所以应该接受新的JS习惯用法,而不是尝试更改它们。请注意,接受一个可选参数,这是getter无法做到的。“变量/属性和方法应该可以有相同的名称”-不,JavaScript不是这样工作的。它们位于同一个“命名空间”中-方法实际上只是普通属性,它们的值是函数对象。这就是为什么你的getter试图获得它自己。我建议你学会将属性作为方法来处理。这是一个相当大的时间浪费,只会产生比解决问题更多的问题。谢谢你的建议