Как можно переопределить свойство length для String - PullRequest
3 голосов
/ 20 августа 2011

Может ли кто-нибудь подсказать мне, как установить мою собственную длину для String, как в "string".length или String("string").length.

Afaik, String является потомком от Object, идлина присваивается, вероятно, в prototype.constructor, а также в prototype.__defineSetter__;

Edit: Мотивация состоит в том, чтобы узнать, насколько далеко можно нажать 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 Ответ

3 голосов
/ 20 августа 2011

Это не совсем возможно.Теоретически, это бы сработало:

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

Но в Chrome это не получается с ошибкой redefine_disallowed.

Честно говоря, я думаю, что есть лучшее решение для вашего сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...