использовать defineProperty из модуля - PullRequest
2 голосов
/ 26 сентября 2011

Допустим, в моем модуле у меня есть что-то вроде этого:

    Object.defineProperty(Array.prototype, 
               'sayHello', {get: function(){ return "hello I'm an array" });

Теперь я хотел бы сделать это изменение видимым для любых скриптов, которые импортируют модуль.Возможно ли это?

Я попытался соответственно изменить EXPORTED_SYMBOLS, но пока не получил никаких результатов.

Есть ли другой способ добиться того же?(т.е. загружать модули, которые добавляют неперечислимые свойства к выбранным объектам - например, Array в приведенном выше примере)

EDIT:

После комментария Альнитака о value: и get:.

Теперь я могу определить и использовать свойство, подобное этому:

Object.defineProperty(Array.prototype, 'firstId' , {value: function(){return this[0].id}});
var a = [{id:'x'},{id:'y'}]
a.firstId()

, которое возвращается, как и ожидалось

x

Теперь: можно ли поставитьвызов defineProperty в модуле, загрузка модуля из сценария и ожидание того, что массивы этого сценария будут действовать так же, как показано выше?

EDIT2:

Я пишу приложение с помощью xulrunnerи я использую Components.utils.import () для установки модуля - я подумал (возможно, неправильно), что вопрос можно поставить более широко ...

1 Ответ

0 голосов
/ 26 сентября 2011

Тип get: в дескрипторе свойства может использоваться для предоставления значения только для чтения, которое рассчитывается во время выполнения:

Object.defineProperty(Array.prototype, 'sayHello', {
    get: function() {
        return "hello I'm an array";
    }
});

Используйте value:, если свойство является просто константой только для чтениязначение:

Object.defineProperty(Array.prototype, 'sayHello', {
    value: "hello I'm an array"
});

Использование обоих из них просто:

var hello = myArray.sayHello;

Вы также должны использовать тип value:, чтобы добавить функцию какне перечисляемое свойство прототипа, например:

Object.defineProperty(Array.prototype, 'sayHello', {
    value: function(o) {
        return "hello I'm an array";
    }
});

использование:

var hello = myArray.sayHello();

Аналогично,

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