İkincisi, özel bir kurucu tarafından yaratılan ilkel olmayan işlev nesnelerine mi atıfta bulunuyor (örneğin, var bird1 = new Bird ();)?
:)
İkincisi, özel bir kurucu tarafından yaratılan ilkel olmayan işlev nesnelerine mi atıfta bulunuyor (örneğin, var bird1 = new Bird ();)?
:)
Yanıtlar:
Her iki terim de ECMAScript spesifikasyonunda tanımlanmıştır:
yerel nesne
Anlambilimi, ana bilgisayar ortamı yerine bu belirtim tarafından tam olarak tanımlanan bir ECMAScript uygulamasındaki nesne.
NOT Standart yerel nesneler bu spesifikasyonda tanımlanmıştır. Bazı yerel nesneler yerleşiktir; diğerleri bir ECMAScript programının yürütülmesi sırasında oluşturulabilir.
Kaynak: http://es5.github.com/#x4.3.6
ana bilgisayar nesnesi
ECMAScript yürütme ortamını tamamlamak için ana bilgisayar ortamı tarafından sağlanan nesne.
NOT Yerel olmayan herhangi bir nesne, bir ana bilgisayar nesnesidir.
Kaynak: http://es5.github.com/#x4.3.8
Birkaç örnek:
Yerli nesneler: Object(kurucu), Date, Math, parseInt, eval, dize gibi yöntemler indexOfve replace, dizi yöntemleri, ...
Sunucu nesneleri (tarayıcı ortamını varsayarak): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...
host object açıklanan tanımına bakın .
'Object'ya vasıtasıyla takdim Object.prototype.toStringolarak '[object Object]'.
Birdkullanıcı tanımlı bir fonksiyonsa, anlambilim ES spesifikasyonu tarafından "tam olarak tanımlanmıştır" (fonksiyon nesnelerinin nasıl çalıştığı, nasıl oluşturulduğu, çalıştırıldığı, newoperatörle nasıl kullanıldığı vb.) yerli nesne ... Bir cevap bırakabilirim ...
Üç tür nesne arasında ayrım yaparsak daha açıktır:
Dahili nesneler : String, Math, RegExp, Object, Functionvb - JavaScript hep çekirdek önceden tanımlanmış nesneler kullanılabilir. ECMAScript spesifikasyonunda tanımlanmıştır.
Ana nesneleri gibi: nesneler window, XmlHttpRequesttarayıcı ortamı tarafından sağlanan bu yüzden, DOM düğümleri ve. Yerleşik nesnelerden farklıdırlar çünkü tüm ortamlar aynı ana nesneye sahip olmayacaktır. JavaScript, tarayıcının dışında çalışıyorsa, örneğin Node.js'de olduğu gibi sunucu tarafı kodlama dili olarak çalışıyorsa, farklı ana bilgisayar nesneleri kullanılabilir olacaktır.
Kullanıcı nesneleri : JavaScript kodunda tanımlanan nesneler. Dolayısıyla, örneğinizdeki 'Kuş' bir kullanıcı nesnesi olacaktır.
JavaScript spesifikasyonu, yerleşik nesneleri ve kullanıcı nesnelerini yerel nesneler olarak gruplandırır . Bu, "yerel" teriminin alışılmışın dışında bir kullanımıdır, çünkü kullanıcı nesneleri açık bir şekilde JavaScript'te uygulanırken, yerleşikler büyük olasılıkla, ana bilgisayar nesnelerinde olduğu gibi, başlık altında farklı bir dilde uygulanır. Ancak JavaScript spesifikasyonu perspektifinden bakıldığında, hem yerleşikler hem de kullanıcı nesneleri JavaScript spesifikasyonunda tanımlandıklarından JavaScript spesifikasyonunda tanımlanırken ana bilgisayar nesneleri tanımlanmamıştır.
İşte benim spesifikasyon anlayışım.
Bu:
var bird = new Bird();
... newoperatör kullanılarak oluşturulan yerel bir Nesne ile sonuçlanır .
Yerel nesneler, aşağıdakilerden birinin dahili [[Sınıf]] özelliğine sahiptir:
"Bağımsız Değişkenler", "Dizi", "Boole", "Tarih", "Hata", "İşlev", "JSON", "Matematik", "Sayı", "Nesne", "RegExp" ve "Dize" .
Senin bird1için şu olacak:
"Nesne"
Tıpkı bir işlev oluşturduğunuzda olduğu gibi:
function my_func() {
// ...
}
... my_funcECMAScript'te tanımlanmamıştır, ancak yine de dahili [[Class]] ile yerel bir nesnedir:
"İşlev"
Bir ana bilgisayar nesnesi, spesifikasyonda tanımlanmayan bu ortama belirli bir amaca hizmet etmek için ortam tarafından sağlanan bir nesnedir.
Örneğin:
var divs = document.getElementsByTagName('div')
Tarafından referans verilen nesne, normal bir JavaScript nesnesi gibi hissettirecek şekilde ortama entegre edilmiş divsbir NodeList'tir , ancak spesifikasyon tarafından herhangi bir yerde tanımlanmamıştır.
Dahili [[Sınıf]] özelliği:
"Düğüm Listesi"
Bu, uygulama tasarımcılarına uygulamayı ortamın özel ihtiyaçlarına uydurmada biraz esneklik sağlar.
Spesifikasyon boyunca tanımlanan ana bilgisayar nesnelerinin gereksinimleri vardır .
birdve Birdvardır yerli nesneleri bir kullanıcı tanımlı fonksiyon (vardır Bird) ve bir nesne ( birdyapıcı olarak işlev kullanımı ile oluşturulan), tüm bu semantik spec tanımlanır. Konak nesneleri hakkında, [[Class]]dahili özelliğe çok fazla güvenmeyin , örneğin window.alert, IE'de sahip olduğu neredeyse tüm uygulamaların özelliğinin "Function"değerine [[Class]]sahiptir "Object"ve hala bir ana nesnedir ...
[[Class]]. Bunu sadece uygulayıcıların farklı nesne türlerini nasıl yorumladıklarına somut bir bakış olarak kullanmak yerine. Öyleyse window.alertbir iç sahip [[Class]]bir "Function"ES 5 ihlali olarak görünüyor?
divs/NodeListbir object. Sanırım bunu henüz anlamıyorum, ama bu onu doğal bir nesne yapmaz mı?
window
Host Objects ile ilgili diğer cevaplara ek olarak.
Konak nesneleri bir ortama özeldir. Dolayısıyla, tarayıcıların ana bilgisayar nesnelerinin yanında, nodejs'de de belirli nesneler vardır.
Örnek uğruna, önce Javascript'te tanımlanan Standart nesnelerle başlayın. Ardından Tarayıcı / DOM için ortak nesneler. Düğümün kendi Nesneleri vardır.
var bird1 = new Bird();Yerel veya ana nesne olup olmadığı sorusuna ikna edici bir yanıt göremedi . Bird'ün kullanıcı tanımlı bir işlev olduğu varsayılırsa , javascript uygulaması tarafından http://es5.github.io/#x13.2'ye göre yerleşik olmayan yerel bir nesne oluşturulacaktır . Buna karşılık, yerel yerleşiknesneler, bir javascript programının (Object ve diğerleri gibi) başlangıcından beri mevcut olacaktır. Yerel nesne ile ana bilgisayar nesnesi arasındaki fark, birincisinin javascript uygulaması tarafından oluşturulması ve ikincisinin ana bilgisayar ortamı tarafından sağlanmasıdır. Sonuç olarak, ana makine nesnesinin dahili [[sınıf]] özelliği, yerleşik nesneler tarafından kullanılanlardan farklı olabilir (ör. "Bağımsız Değişkenler", "Dizi", "Boole", "Tarih", "Hata", "İşlev", " JSON "," Matematik "," Sayı "," Nesne "," RegExp "ve" Dize ").
Ayrıca, ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf'in artık yerel terminolojiyi ve ana nesneleri kullanmadığını belirtmek gerekir . Bunun yerine, amaçlanan davranışları hakkında daha net açıklamalarla aşağıdaki nesne türlerini tanımlar.
4.3.6 sıradan nesne
Tüm nesneler tarafından desteklenmesi gereken temel dahili yöntemler için varsayılan davranışa sahip nesne
4.3.7 egzotik nesne
Tüm nesneler tarafından desteklenmesi gereken bir veya daha fazla temel iç yöntem için varsayılan davranışa sahip olmayan nesne NOT Sıradan bir nesne olmayan herhangi bir nesne, egzotik bir nesnedir.
4.3.8 standart nesne
Anlambilimi bu belirtimle tanımlanan nesne
4.3.9 yerleşik nesne
ECMAScript uygulaması tarafından belirtilen ve sağlanan nesne
Üç nesne göz önünde bulundurulduğunda: Ana Bilgisayar, Yerel, Özel.
Ana Bilgisayar Nesneleri, ortam tarafından oluşturulur ve ortama özeldir. En iyi bilinen ortam bir web tarayıcısı olabilir, ancak başka bir platform olabilir. Web tarayıcısında oluşturulan ana bilgisayar nesneleri, pencere nesnesi veya belge olabilir. Tipik olarak bir tarayıcı, Belge Nesne Modelini JavaScript'e yansıtmak üzere Ana Bilgisayar Nesneleri oluşturmak için bir API kullanır. (Web tarayıcısının bunu yapan farklı JavaScript Motorları vardır) Sayfa tarayıcıda görüntülendiği anda bir ana bilgisayar nesnesi otomatik olarak oluşturulur.
Bir Yerel Nesne, geliştirici tarafından önceden tanımlanmış JavaScript sınıfları kullanılarak oluşturulur. Yerel Nesneler, yazılı betiğinizdedir.
Daha sonra, geliştirici tarafından özel (önceden tanımlanmamış veya kısmen önceden tanımlanmamış) bir sınıftan bir Özel Nesne oluşturulur.
Yerel nesneler, teknik özelliklere uyan nesnelerdir, yani "standart nesneler".
Konak nesneleri, tarayıcının (veya Node gibi diğer çalışma zamanı ortamının) sağladığı nesnelerdir.
Çoğu ana bilgisayar nesnesi yerel nesnelerdir ve ne zaman bir şeyi kullanarak somutlaştırırsanız new, garip ana nesnelerle uğraşmazsanız, bunun yerel bir nesne olduğundan% 99,99 emin olabilirsiniz.
Bu kavram, IE'de (ve diğer eski tarayıcılarda?) Çok tuhaf nesnelerin varlığı nedeniyle ortaya çıkmıştır . Örneğin:
typeof document.all == "undefined"; // true
document.all.myElementId; // object
Bunu görünce herkes bunun document.allaçıkça "standart dışı" olduğu ve dolayısıyla yerel olmayan bir ana bilgisayar nesnesi olduğu konusunda hemfikir olacaktır .
Öyleyse neden ilk etapta yerel nesneleri standart nesneler olarak adlandırmıyorsunuz ? Basit: Sonuçta, Standart (!) Belge yerel olmayan nesnelerden de bahsediyor ve onları standart dışı olarak adlandırmak bir paradoksa yol açacaktır.
Tekrar:
Bu aşırı olabilir, ancak basit olması için yerel bir nesne, ECMAScript uyumlu bir motoru uygulayan herhangi bir ortamda var olan ve kullanılabilir olan bir nesnedir. Bu genellikle (ancak her zaman değil) bir tarayıcıdır.
Dolayısıyla, Internet Explorer'ınız veya Google Chrome'unuz, örneğin String nesnesini sizin için kullanılabilir hale getirmez. String nesnesini kullanabilmenizin nedeni, JavaScript dilinin kendisi için "yerel" (yerleşik) olmasıdır.
Ancak, bir açılır pencere oluşturmak isterseniz, pencere nesnesini kullanmanız gerekir. Pencere nesnesi, tarayıcı yazılımının kendisi tarafından sağlanır, bu nedenle JavaScript'e özgü değildir, ancak "Tarayıcı Nesne Modeli" veya Malzeme Listesinin bir parçasıdır.