【问题标题】:How could the length property for String be overriden字符串的长度属性如何被覆盖
【发布时间】:2011-10-31 03:36:42
【问题描述】:

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

Afaik,StringObject 的后代,长度分配可能发生在 prototype.constructorprototype.__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”。

可以在DefineOwnProperty下找到引发错误的JS引擎代码:

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

【问题讨论】:

  • 您是否尝试过实际更改字符串的长度? :P。在更严肃的语气中,你到底为什么要那样?!
  • 是的,我不认为这是你真正想做的事情
  • 是的,我确实修改了原型、defineSetter 和 defineProperties。我想知道我可以在当前浏览器中将本机“对象”推送多远。这允许在 javascript 上更轻松地实现编程语言

标签: javascript string object constructor


【解决方案1】:

这不太可能。从理论上讲,这可以完成这项工作:

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

但在 Chrome 上它失败并出现错误 redefine_disallowed

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

【讨论】:

猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多