Есть ли такая вещь, как универсальный ключ для объекта javascript? - PullRequest
11 голосов
/ 01 марта 2010

С учетом следующего примера JavaScript:

var myobj = {   func1: function() { alert(name in this) },
                func2: function() { alert(name in this) },
                func3: function() { alert(name in this) }
}

myobj.func2(); // returns true
myobj.func4(); // undefined function

Можно ли создать для всех 100 * ключ 'catch-all', который будет вызываться, если не определена ни одна клавиша / функция (как в func4()) при сохранении формата myobj.functionCall()?

Ответы [ 2 ]

23 голосов
/ 25 мая 2016

Вы можете создать объект JavaScript с ключами 'wildcard' или 'catch-all', используя Proxy и функцию getter. В отличие от предоставляемых решений, прокси должен работать практически в любой среде, включая Node.js

var foo = new Object()

var specialFoo = new Proxy(foo, {
    get(target,name) {
        // do something here
        return name
    }
})

console.log(specialFoo.blabla) // this will output "blabla"

Если вы хотите, чтобы свойства вызывались, просто верните функцию:

var specialFoo = new Proxy(foo, {
    get(target,name) {
        return function() {
            console.log('derp')
            return name
        }
    }
})


specialFoo.callMe() // this will print derp

Подробности: документация по Mozilla

16 голосов
/ 01 марта 2010

Вы ищете __noSuchMethod__:
JavaScript get для всех свойств

...