2010-05-03 2 views
10

Механизм JavaScript Spider-Monkey реализует функцию обратного вызова __noSuchMethod__ для объектов JavaScript.Доступ к неопределенному свойству в JavaScript

Эта функция вызывается всякий раз, когда JavaScript пытается выполнить неопределенный метод объекта.

Я хотел бы установить функцию обратного вызова для объекта, который будет вызываться всякий раз, когда к объекту, к которому осуществляется доступ или которому присвоено неопределенное свойство.

Я не нашел функцию __noSuchProperty__, реализованную для объектов JavaScript, и я - любопытство, если есть какое-либо обходное решение, которое достигнет того же результата.

Рассмотрим следующий код:

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

Это эквивалентно [alert(1);alert(2)] - даже если a.bla не определен.

Я хотел бы добиться того же результата, но с неизвестными свойствами (то есть, не зная заранее, что. «Ли» будет собственность доступа)

ответ

4

В следующей версии ECMAScript в это должно быть довольно легко, используя Object.observe подробнее здесь: http://addyosmani.com/blog/a-few-new-things-coming-to-javascript/

+0

Спасибо Моше. Принял этот ответ, поскольку он решает исходный вопрос. – avri

+1

Этот ответ не решает вопрос. Функция, которую вы ищете, называется ['Proxy', и она не будет реализована в ближайшее время] (http://stackoverflow.com/q/6429521/1269037). –

2

Я хотел бы установить функцию обратного вызова Объект, который будет вызываться всякий раз, когда к объекту, к которому осуществляется доступ или которому присвоено неопределенное свойство.

Хотя это не исчерпывающий ответ, имейте в виду, что назначение неопределенным свойствам объекта является ключевой особенностью языка JavaScript.

Также обратите внимание, что __noSuchMethod__is a non-standard method, реализованный двигателями Mozilla JavaScript. Существует open feature request, чтобы это было реализовано в движке V8 Google Chrome, но насколько я знаю, это не поддерживается в других браузерах.

По состоянию на февраль 2014 года, It looks like this won't be supported any time soon.

+0

Спасибо за ваш анс wer - я должен уточнить свой вопрос следующим образом: Есть ли способ сделать то же самое в движке JavaScript Spider-Monkey? – avri

+0

@avri: 'NoSuchMethod' поддерживается в SpiderMonkey, но я сомневаюсь, что вы найдете встроенный метод, который ловит попытки назначить неопределенным свойствам, потому что это на самом деле функции языка. –

+1

Не думаю, что тот факт, что назначение неопределенным свойствам объекта является ключевой особенностью языка JavaScript, имеет значение: факт есть, JavaScript предоставляет методы __defineGetter__ и __defineSetter__. Рассмотрите следующий код: var a = {}; a .__ defineGetter __ ("bla", function() {alert (1); return 2;}); предупреждение (a.bla); Это равнозначно [alert (1); alert (2)] - хотя a.bla не определено. Я хотел бы достичь того же результата, но с неизвестными свойствами (т.не зная заранее, что a. «bla» будет доступным к ресурсу) – avri

2

Up, ребята, я думаю, что нам нужно, чтобы проголосовать за эту функцию в списке Google V8 вопросов, здесь http://code.google.com/p/v8/issues/detail?id=264

Кажется, что нет много внимания к этой очень важной особенности . :(

+0

[Команда разработчиков V8 не заботится об этом] (http://stackoverflow.com/q/6429521/1269037). –