Doğru anlarsam, JavaScript'teki her nesne, Nesne prototipinden miras alır
Tüyleri bölmek gibi görünebilir, ancak JavaScript (ECMAScript uygulamaları için genel terim) ve ECMAScript (JavaScript uygulamaları için kullanılan dil ) arasında bir fark vardır . JavaScript'i değil, miras şemasını tanımlayan ECMAScript'tir, bu nedenle yalnızca yerel ECMAScript nesnelerinin bu miras şemasını uygulaması gerekir.
Çalışan bir JavaScript programı, en azından yerleşik ECMAScript nesnelerinden (Nesne, İşlev, Sayı, vb.) Ve muhtemelen bazı yerel nesnelerden (örneğin işlevler) oluşur. Ayrıca bazı ana bilgisayar nesneleri de olabilir (bir tarayıcıdaki DOM nesneleri veya diğer ana bilgisayar ortamlarındaki diğer nesneler gibi).
Yerleşik ve yerel nesnelerin ECMA-262'de tanımlanan miras şemasını uygulaması gerekirken, ana makine nesneleri bunu yapmaz. Bu nedenle, bir JavaScript ortamında değil tüm nesneler gerekir devralan Object.prototype . Örneğin, ActiveX nesneleri olarak uygulanan Internet Explorer'daki ana bilgisayar nesneleri, yerel nesneler olarak değerlendirilirse hatalar atar (bu nedenle try..catch , Microsoft XMLHttpRequest nesnelerini başlatmak için kullanılır ). Bazı DOM nesneleri (Internet Explorer'da tuhaf moddaki NodeLists gibi) Array yöntemlerine aktarılırsa hatalar atar, Internet Explorer 8 ve daha düşük sürümlerdeki DOM nesneleri ECMAScript benzeri bir devralma şemasına sahip değildir vb.
Bu nedenle, bir JavaScript ortamındaki tüm nesnelerin Object.prototype'dan miras aldığı varsayılmamalıdır.
yani JavaScript'teki her nesnenin prototip zinciri aracılığıyla hasOwnProperty işlevine erişimi vardır.
Bu, en azından Internet Explorer'daki tuhaflıklar modundaki (ve Internet Explorer 8 ve daha düşük sürümler her zaman) belirli ana bilgisayar nesneleri için doğru değildir.
Yukarıdakiler göz önüne alındığında, bir nesnenin neden kendi hasOwnProperty yöntemine sahip olabileceği ve bunun iyi bir fikir olup olmadığını test etmeden başka bir hasOwnProperty yöntemini çağırmanın tavsiye edilebilirliği üzerinde düşünmeye değer.
Kullanım nedeninin Object.prototype.hasOwnProperty.call
bazı tarayıcılarda, ana bilgisayar nesnelerinin hasOwnProperty yöntemine sahip olmaması , call kullanmanın ve yerleşik yöntemin bir alternatif olması olduğundan şüpheleniyorum . Ancak, genel olarak bunu yapmak, yukarıda belirtilen nedenlerden dolayı iyi bir fikir gibi görünmüyor.
Ana bilgisayar nesneleri söz konusu olduğunda, in operatörü genel özellikleri test etmek için kullanılabilir, ör.
var o = document.getElementsByTagName('foo');
o.hasOwnProperty('bar');
('bar' in o);
Object.prototype.hasOwnProperty.call(o, 'bar');
Bir alternatif ( Internet Explorer 6 ve diğerlerinde test edilmiştir ):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Bu şekilde, yalnızca nesnenin sahip olmadığı (miras alınan veya başka türlü) yerleşik hasOwnProperty öğesini özel olarak çağırırsınız .
Bununla birlikte, bir nesnenin bir hasOwnProperty
yöntemi yoksa, nesnenin büyük olasılıkla bir kalıtım şemasına sahip olmaması ve tüm özelliklerin nesnede olması nedeniyle (bu sadece bir varsayım), örneğin in operatörünü kullanmak muhtemelen uygundur . in operatörü, özellikler için DOM nesnesi desteğini test etmenin yaygın (ve görünüşte başarılı) bir yoludur.