2011-08-20 29 views
3

有人可以指导我如何为String设置自己的长度,如"string".lengthString("string").length如何覆盖字符串的长度属性

据我所知,StringObject的后裔,并且长度分配可能发生在prototype.constructor,以及在prototype.__defineSetter__;

编辑: 的动机是要学会在当前的浏览器多远的javascript可以推到其中以实现自己的语言。运算符重载是我的第二大担忧,它似乎被故意阻塞(即没有参数传递给运算符函数)。

一些动机来自:

http://code.google.com/p/traceur-compiler/


UPDATE: 除了新的对象可以与被锁定: Object.preventExtensions(String.prototype);

Object.seal(OBJ)...不允许配置性

Object.freeze(OBJ)......还不允许写

在这里看到:http://msdn.microsoft.com/en-us/library/ff806191(v=vs.94).aspx#Y240

我想可能有一些办法

Object.defineProperty(String, "length", { 
     value: 101, 
     writable: true, 
     enumerable: true, 
     configurable: true 
    }); 
0:不撤销该锁定状态....

重新定义可以这样做

但是会在Chrome V8中抛出“redefine_disallowed”。

抛出错误

的JS引擎的代码可以在这里找到DefineOwnProperty下:

http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/v8natives.js?r=8073

+3

你是否尝试改变字符串的长度? :P。用更严肃的语调,你为什么要这么做?! –

+0

是的,我不认为这是你真正想做的事 –

+0

是的,我修改了原型,__defineSetter__和defineProperties。 我想知道我可以在当前的浏览器中推送原生“对象”多远。这使得编程语言在javascript上更容易实现顶部 –

回答

3

这是不太可能的。从理论上讲,这将做的工作:

Object.defineProperties(String.prototype, { 
    length: { 
     get: function(){ return 1; } 
    } 
}); 

但在Chrome它失败,出现错误redefine_disallowed

我真的认为你的方案有更好的解决方案。

+1

好的答案;我碰到了同样的死亡。 的确,至少该方法在那里: http://kangax.github.com/es5-compat-table/ –