2010-03-01 12 views
11

:Bir javascript nesnesi için yakalama anahtarı gibi bir şey var mı? Aşağıdaki javascript örneği düşünüldüğünde

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 

(func4() olduğu gibi) tanımlanmış bir anahtar/fonksiyon varsa myobj.functionCall() koruyarak mümkün denilen alacak myobj için bir 'catch-all' anahtar oluşturmak için mi biçim?

+0

Gerçekten mi? Birine işaret etmek ister misiniz? Eğer bir tane bulabilirsen, ben soruyu sileceğim. – user113716

+0

@Pointy - dilde nasıl uygulanabileceğini hayal edemiyor musunuz? Eğer öyleyse, joker anahtar nasıl olur *? – user113716

+0

Bunun nasıl uygulanacağını hayal etmek için çok aptal olduğumu söylüyorum :-) Ayrıca, semantikler karmaşık olacak gibi görünüyor; Sadece bir joker girişi yapar mısın? Eğer değerini bir işlev yerine 37'ye ayarlarsanız ne olur? – Pointy

cevap

16

Sen __noSuchMethod__ aradığınız:
JavaScript getter for all properties

+0

Hmmm ... Denedim '__noSuchMethod__: function() {alert ('yakaladım')},' fakat bu çağrılmadı. – user113716

+1

yanlış imzası: '__noSuchMethod__: function (id, args)' –

+1

İlginç ... Firefox kullandığımda, Safari’yi değil, adıma giriyorum. – user113716

17

Sen 'joker' ya da Proxy ve alıcı işlevi kullanarak 'catch-all' tuşlarıyla bir JavaScript nesnesi oluşturabilir.

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


specialFoo.callMe() // this will print derp 

Ayrıntıları: çözümlerin sağlanan farklı olarak, bir proxy node.js Eğer özellikler çağrılabilir olmasını istiyorsanız, basitçe bir işlev döndürecek

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" 

dahil olmak üzere hemen her ortamda çalışması gerekir documentation on mozilla