10

The Spider-Monkey JavaScript engine implements the __noSuchMethod__ callback function for JavaScript Objects.

This function is called whenever JavaScript tries to execute an undefined method of an Object.

I would like to set a callback function to an Object that will be called whenever an undefined property in the Object is accessed or assigned to.

I haven't found a __noSuchProperty__ function implemented for JavaScript Objects and I am curios if there is any workaround that will achieve the same result.

Consider the following code:

var a = {};
a.__defineGetter__("bla", function(){alert(1);return 2;});
alert(a.bla);

It is equivalent to [alert(1);alert(2)] - even though a.bla is undefined.

I would like to achieve the same result but to unknown properties (i.e. without knowing in advance that a."bla" will be the property accessed)

Dan Dascalescu
  • 110,650
  • 40
  • 276
  • 363
avri
  • 125
  • 2
  • 11

3 Answers3

4

In ECMAScript's next version it should be quite easy, using Object.observe. Read more here: http://addyosmani.com/blog/a-few-new-things-coming-to-javascript/

Moshe
  • 2,578
  • 2
  • 26
  • 31
  • Thanks Moshe. Accepted this answer, as it solves the original question. – avri Nov 26 '12 at 07:33
  • 1
    This answer doesn't solve the question. The feature you're looking for is called [`Proxy` and it won't be implemented any time soon](http://stackoverflow.com/q/6429521/1269037). – Dan Dascalescu Feb 22 '14 at 11:58
2

I would like to set a callback function to an Object that will be called whenever an undefined property in the Object is accessed or assigned to.

While this is not an exhaustive answer, keep in mind that assigning to undefined properties of an object is a key feature of the JavaScript language.

Also note that __noSuchMethod__ is a non-standard method, implemented by Mozilla's JavaScript engines. There is an open feature request for this to be implemented in Google Chrome's V8 engine, but as far as I know this is not supported in other browsers.

As of Feb 2014, It looks like this won't be supported any time soon.

Community
  • 1
  • 1
Daniel Vassallo
  • 312,534
  • 70
  • 486
  • 432
  • Thanks for your answer - I should refine my question as follows: Is there a way to do the same in the Spider-Monkey JavaScript engine? – avri May 03 '10 at 06:44
  • @avri: `noSuchMethod` is supported in SpiderMonkey, but I doubt that you will find an inbuilt method that catches attempts to assign to undefined properties, because these are actually features of the language. – Daniel Vassallo May 03 '10 at 06:46
  • 1
    I don't think that the fact that assigning to undefined properties of an object being a key feature of the JavaScript language should matter - fact is, JavaScript provides the __defineGetter__ and __defineSetter__ methods. Consider the following code: var a = {}; a.__defineGetter__("bla", function(){alert(1);return 2;}); alert(a.bla); It is equivalent to [alert(1);alert(2)] - even though a.bla is undefined. I would like to achieve the same result but to unknown properties (i.e. without knowing in advance that a."bla" will be the property accessed) – avri May 03 '10 at 06:49
  • @avri: you may want to edit your question with this example. I think it will provide a better context to what you are looking for. – Daniel Vassallo May 03 '10 at 06:52
2

Up, guys I think we need to vote for this feature on Google V8 issues list, here http://code.google.com/p/v8/issues/detail?id=264

It seems that there's no much attention to this very important feature :(

Alex Craft
  • 9,706
  • 6
  • 45
  • 79