0

使用prototype方法我们可以创建新的方法......比如......

Object.prototype.newMethod=function(){
   // do something
}

在这里,我newMethod使用匿名函数定义...现在如果我想使用这个方法,我必须像这样使用它:<object>.newMethod();

但是现在我想创建一个可以使用的新方法,例如:<object>.newMethod;...没有括号...我该怎么做...??

请不要使用任何jQuery ...

4

3 回答 3

5

呃,你不能。要调用方法,请在其后加上括号。否则,您只是在引用它。

这条规则的唯一例外是当你写类似的东西时new Date,括号是由于new关键字而隐含的,只是因为没有给出参数。

于 2012-10-17T15:10:40.997 回答
1

我真的不明白你为什么要这样做,但这可能的,尽管有一个讨厌的 hacky 解决方法。AFAIK,您实际上正在寻找的是一个神奇的属性(如someArray.length属性)。

var foo = {val:'foo'};
foo.length = (function(that)
{
    return function()
    {
        return that.val.length;
    }
})(foo);
//at this point foo.length(); returns 3, but still requires parentheses
//so, build another closure, and assign a valueOf method to the lenth method:
foo.length.valueOf = (function(method)
{
    return function()
    {
        return method();//call the length method
    }
})(foo.length);
console.log(foo.length +1);//logs 4
foo.val += 'bar';
console.log(foo.length);//logs 6
//BUT:: be carefull!!
alert(foo.length);//coerces to string, we haven't redefined the toString method, so the function code will be alerted
alert(foo.length + '');//alerts 6

这只是为了向您展示,的,理论上是可能的,但是请,请,不要使用这种过度污染的黑客......我还没有彻底测试过这个,但是 ATM,我已经注意到console.log(foo.length);可以返回一个不同的值,不知道为什么,但是:

foo = {val:'foo'};
foo.length = (function(that){return function(){ return that.val.length;};})(foo);
foo.length.valueOf = (function(method){return function(){return method();};})(foo.length);
foo.length;//returns 3, great
foo.val += 'bar';
console.log(foo.length);//logged 3 at first, now it's back to logging 6!<-- don't trust this is the conclusion
于 2012-10-17T15:43:46.840 回答
0

调用不带括号的函数的唯一方法是使用getterssetters定义它。

请注意,这些是 JavaScript 1.8 的新功能,并非所有浏览器都支持。

于 2012-10-17T15:26:57.730 回答