如何覆盖String的length属性

时间:2011-08-20 09:33:40

标签: javascript string object constructor

有人可以指导我如何为String设置自己的长度,例如"string".lengthString("string").length

Afaik,String是来自Object的后代,长度分配可能发生在prototype.constructor以及prototype.__defineSetter__;

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

一些动机来自:

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


更新: 可以使用以下命令锁定新对象的添加: 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
    });

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

抛出错误的JS引擎代码可以在DefineOwnProperty:

下找到

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

1 个答案:

答案 0 :(得分:3)

这不太可能。从理论上讲,这可以胜任:

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

但在Chrome上,它失败并显示错误redefine_disallowed

老实说,我认为你的方案有更好的解决方案。