使用模块中的defineProperty

发布于 2024-12-06 16:02:52 字数 811 浏览 0 评论 0原文

假设在我的模块中我有这样的内容:

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

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

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

还有另一种方法可以实现同样的目的吗? (即加载向选定对象添加不可枚举属性的模块 - 如上面示例中的数组)

编辑:

遵循 Alnitak 下面关于 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() 来加载模块 - 我认为(可能是错误的)这个问题可以更普遍地提出......

Let's say in my module I have something like this :

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

Now I would like to make this change visible to any scripts that import the module. Is this possible ?

I tried to modify the EXPORTED_SYMBOLS accordingly but I got no results so far.

Is there another way to achieve the same thing ? (i.e. load modules that add not enumerable properties to selected objects - like Array in the example above)

EDIT:

Following the comment below by Alnitak about value: and get: ...

I'm able now to define and use a property like this:

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

that returns as expected

x

Now: is it possible to put the defineProperty invocation in a module, load a module from a script and expects that the Arrays of this script will act as the one above ?

EDIT2 :

I'm writing an application with xulrunner and I'm using Components.utils.import() to laod the module - I thought (probably wrongly) that the question could be put more generally ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灯下孤影 2024-12-13 16:02:52

属性描述符中的 get: 类型可用于提供在运行时计算的只读值:

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

如果属性只是只读常量,请使用 value: 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";
    }
});

usage :

var hello = myArray.sayHello();

同样地,

The get: type within a property descriptor can be used to supply a read-only value that's calculated at runtime:

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

Use value: if the property is just a read-only constant value:

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

The usage of both of those is just:

var hello = myArray.sayHello;

You should also use the value: type to add a function as a non-enumerable property of a prototype, e.g.:

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

usage:

var hello = myArray.sayHello();

Likewise,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文