2

假设在我的模块中我有这样的东西:

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

现在,我想让任何导入模块的脚本都可以看到此更改。这可能吗 ?

我尝试相应地修改 EXPORTED_SYMBOLS,但到目前为止我没有得到任何结果。

有没有另一种方法来实现同样的事情?(即加载模块,将不可枚举的属性添加到选定的对象 - 如上面示例中的 Array)

编辑:

在 Alnitak 下面关于value:get:...的评论之后

我现在可以定义和使用这样的属性:

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

按预期返回

x

现在:是否可以将 defineProperty 调用放在一个模块中,从脚本加载一个模块并期望该脚本的数组将作为上面的数组?

编辑2:

我正在用 xulrunner 编写一个应用程序,我正在使用 Components.utils.import() 来加载模块 - 我认为(可能是错误的)这个问题可以更普遍地提出......

4

1 回答 1

0

属性描述符中的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();

同样地,

于 2011-09-26T14:12:08.413 回答