所以我创建了一个这样的函数,
var functionName = function(arg1) { //code logic here; }
同时,我需要此功能作为对象。它不会真正保存任何东西,但数据将从另一个对象访问。
var myObj = new Object();
myObj.x = 3;
myObj.y = 4;
所以,当我去functionName.x
时,它应该返回myObj.x
。 myObj
对象正在其他地方维护,我无法控制它。
这就是我目前的实施方式,
functionName.__proto__ = myObj;
工作正常。但__proto__
已被弃用,我想看看是否还有其他安全方法。我想到了覆盖Function.prototype
,但它不起作用。
答案 0 :(得分:1)
您想要实现myObj的委托:
var functionName = function(arg1) { // code }
functionName.myObj = new MyObj();
for (prop in functionName.myObj) {
if (functionName.myObj.hasOwnProperty(prop)) {
functionName.__defineGetter__(prop, function() { return functionName.myObj[prop]; } );
}
}
答案 1 :(得分:1)
我在这里遇到同样的问题。不幸的是,在EcmaScript 5.1下没有好的解决方案。
在语言规范http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf中,它在13.2“创建函数对象”中说,新创建的函数对象的[[Prototype]]内部属性始终是标准的内置函数原型对象。
如同相同规范的13.3中所详述,使用Function构造函数也没有帮助,因为new Function(…)
构造的函数也使用13.2中详述的方法。 (prototype
的{{1}}属性既不可写也不可配置,这反映了这一点。
因此,为了实现您想要的目标,您需要一种方法来更改现有对象的原型。幸运的是,即将出版的Ecmascript 6标准似乎在最近的草案http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_05-14-13-nomarkup.pdf中根据附件B.2.2标准Function
。
答案 2 :(得分:-1)
您可以设置功能的prototype
。
function functionName(arg1) {
//code logic here;
}
var myObj = { x: 3, y: 4 };
functionName.prototype = myObj;
var obj = new functionName();
console.log(obj.x, obj.y); // will output 3, 4