なぜあなたがそれをしたいのか私は本当に理解できませんが、厄介なハッキーな回避策はありますが、それは可能です。あなたが実際に探しているのは、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