So I created a function like this,
var functionName = function(arg1) { //code logic here; }
At the same time, I need this function to work as an object. It will not really save anything, but the data will be accessed from another object.
var myObj = new Object();
myObj.x = 3;
myObj.y = 4;
So when I go, functionName.x it should return myObj.x. The myObj object is being maintained someplace else and I don't have any control of it.
This is how I currently implemented it,
functionName.__proto__ = myObj;
It works fine. But __proto__ is deprecated already and I would want to see if there is any other safe way of doing it. I thought of overriding Function.prototype but it doesn't work.
-
Why don't you just store in functionName just a reference to myObj ?ngonzalvez– ngonzalvez2012年09月16日 01:37:50 +00:00Commented Sep 16, 2012 at 1:37
-
@Kryz I'm not sure I understand. I can't do functionName = myObj cuz that will override the function definition. Currently, functionName is being accessed as functionName() and functionName.x so I need to maintain the behavior.John Ng– John Ng2012年09月16日 01:45:23 +00:00Commented Sep 16, 2012 at 1:45
-
A side remark: myObj should probably be derived from Function.prototype, so that you still have access to functionName.bind, etc. (Of course, this has nothing to do with the original problem.)Marc– Marc2013年06月06日 11:03:27 +00:00Commented Jun 6, 2013 at 11:03
3 Answers 3
You want to implement a delegate to 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]; } );
}
}
3 Comments
I am having the same problem here. Unfortunately, there is no good solution under EcmaScript 5.1.
In the language specification http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf it says in 13.2 "Creating Function Objects" that the [[Prototype]] internal property of a newly created function object is always the standard built-in Function prototype object.
As detailed in 13.3 of the same specification, using the Function constructor is also of no help as a function constructed by new Function(...) also uses the method detailed in 13.2. (This is reflected by the fact that the prototype property of Function is neither writable nor configurable.
So to achieve what you want, you need a method to change the prototype of already existing objects. Fortunately, the upcoming Ecmascript 6 standard seems to standardises Object.prototype.__proto__ as per annex B.2.2 in the recent draft 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.
Comments
You could set the prototype of the function.
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
2 Comments
__proto__. This doesn't do that. Hence it should be deleted.