2011-08-20 79 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/ –