Anonim nesnenin bir yöntemi olup olmadığını nasıl kontrol edebilirim?


145

Anonim bir nesnenin bu şekilde oluşturulmuş olup olmadığını nasıl kontrol edebilirim:

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

Gerçekten bir prop2 tanımlanmış mı?

prop2 her zaman bir işlev olarak tanımlanır, ancak bazı nesneler için gerekli değildir ve tanımlanmaz.

Burada önerilen ne denedim: Yerel JavaScript nesnesi bir özellik / yöntem olup olmadığını nasıl belirlenir? ama anonim nesneler için işe yaradığını sanmıyorum.


6
JavaScript'teki anonim ve anonim olmayan nesneler arasında çok fazla fark yoktur. Kapağın altında aynılar.
vava

Yanıtlar:


279

typeof myObj.prop2 === 'function'; işlevin tanımlı olup olmadığını size bildirir.

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
Dinamik değişkenle kontrol etmek istiyorsanız bunu deneyinif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

İstediğiniz hasOwnProperty():

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

Kaynaklar: Mozilla , Microsoft , phrogz.net .


4
Eğer örneğin, kendi kendine yapılan nesne içinde bir dom düğümünü vermiş, bu işe yaramaz var my_obj = {'node1': document.createElement('div')};ardından my_obj.node1.hasOwnProperty('cloneNode')yanlıştır. Ancak Sean'ın çözümü doğru bir şekilde dönecektir:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
Prototipte tanımlanmış bir yöntem arıyorsanız çalışmaz.
Wilt

2
@Wilt soru anonim nesne değişmez belirtildi.
artlung

4
@artlung Evet, cevabınız soru için iyidir, sadece diğer yorumları (benim gibi) çalışan benzer bir çözüm arayanlar için bu yorumu burada bırakmak istedim ... Cevabınızı diskalifiye etmek istememiştim.
Wilt

2
Özelliğin tanımlandığı durumu işlemez, ancak bir işlev değildir.
matt2000

15

3 Seçenekler

  1. typeof myObj.prop2 === 'function' özellik adı dinamik değilse / oluşturulmuşsa
  2. myObj.hasOwnProperty('prop2') özellik adı dinamikse ve yalnızca doğrudan özellik olup olmadığını kontrol edin (prototip zincirinde değil)
  3. 'prop2' in myObj özellik adı dinamikse ve prototip zincirini kontrol edin

8

"Anonim bir nesne" ile ne demek istiyorsun? myObjdeğişkene değişmez bir nesne atadığınız için anonim değildir. Bunu sadece test edebilirsiniz:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}

1

Bunu yapmanın bir yolu if (typeof myObj.prop1 != "undefined") {...}


0

Bu eski bir soru olduğunu biliyorum, ama OP sadece varlığını kontrol etmek istediğinde , tüm cevaplar yöntemin var olduğunu ve bir işlev olduğunu şaşırttı . Bunun bir işlev olduğunu bilmek (birçok kişinin belirttiği gibi) kullanabilirsiniz:

typeof myObj.prop2 === 'function'

Ancak bir koşul olarak da kullanabilirsiniz:

typeof myObj.prop2

Ya da:

myObj.prop2

Bunun nedeni, bir fonksiyonun değerlendirilmesi trueve undefineddeğerlendirilmesidir false. Yani eğer üye varsa, bunun sadece bir işlev olabileceğini biliyorsanız, şunları kullanabilirsiniz:

if(myObj.prop2) {
  <we have prop2>
}

Veya bir ifadede:

myObj.prop2 ? <exists computation> : <no prop2 computation>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.