Yerel nesneler ile ana nesneler arasındaki fark nedir?


91

İkincisi, özel bir kurucu tarafından yaratılan ilkel olmayan işlev nesnelerine mi atıfta bulunuyor (örneğin, var bird1 = new Bird ();)?


2
Yerel nesneler ECMAScript belirtiminde tanımlanır, ana nesneler tanımlanmaz.
Šime Vidas

6
Örneğin bir DOM öğesi new Image(), örneğin bir ana bilgisayar nesnesidir.

@ ŠimeVidas: Cevabınızla çelişen bir yorum bırakmanızın bir nedeni var mı?
user113716

@ Ӫ _._ Ӫ Artık benim olayım:)
Šime Vidas

1
@ ŠimeVidas: Yorumunuz, ana nesnelerin ECMAScript belirtiminde tanımlanmadığını belirtir . Cevabınız "Her ikisinin de tanımları ECMAScript belirtimindedir" diyor .
user113716

Yanıtlar:


135

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, ...


8
ona da bazı örnekler verin, yerel nesne: Array, String .., host object: window ...
Poelinca Dorin

1
özel bir tasarımcıya ne dersiniz? örneğin, gönderimdeki kuş örneği
ppecher

2
@ ŠimeVidas: "O zaman bu bir ana bilgisayar nesnesi." Bu doğru değil. Bu cevaptahost object açıklanan tanımına bakın .
user113716

1
ŠimeVidas: Ancak spesifikasyon 'Bir ana bilgisayar nesnesinin [[Sınıf]] dahili özelliğinin değeri , "Bağımsız Değişkenler", "Dizi", "Boole", "Tarih", "Hata" dışında herhangi bir Dize değeri olabilir , "İşlev", "JSON", "Matematik", "Sayı", "Nesne" , "RegExp" ve "Dize". ' İç [[Class]] senin Kuş nesnenin özelliği olacak 'Object'ya vasıtasıyla takdim Object.prototype.toStringolarak '[object Object]'.
user113716

2
@ ŠimeVidas, katılmıyorum, eğer 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 ...
Christian C. Salvadó

28

Üç 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.


Yerel nesneler, javascript uygulaması (motor) tarafından oluşturulan nesnelere karşılık gelir. Yerleşik ve diğer yerel nesneler (kullanıcı nesneleri) arasındaki fark, eski nesnelerin javascript programının başlangıcından bu yana ilgili ECMA kurallarına uygun olarak mevcut olmasıdır. ECMA6 (<ECMA6 yana ecma-international.org/publications/files/ECMA-ST/... ) sınıflandırmak nesnelere terminoloji yukarıdaki kullanmaz. Aşağıdaki cevabıma bakın.
jaaw

17

İş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 .


2
1, sana katılıyorum, 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 ...
Christian C.Salvadó

Teşekkürler @ CMS. Evet, içini kullanmaya çok fazla önem vermek istemedim [[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?
user113716

Bunun bir eylem olmadığını görmeye çalışıyorum, ama bu div türünü alırsam, divs/NodeListbir object. Sanırım bunu henüz anlamıyorum, ama bu onu doğal bir nesne yapmaz mı?
Mark B

Bu yardımcı olur . Her şeyi window
Mark B

Bird, arayüzü ECMASCript standardında tam olarak tanımlanmadığı için yerel bir nesne değildir. Gerçekten bu kadar basit. Nesne yereldir ve String yereldir, ancak kullanıcı tanımlı veya ana bilgisayar tanımlı nesneler yerel değildir.
Scott Marcus

4

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.

  1. Standart Javascript yerleşik nesne örnekleri:
  1. Ana Nesneler Belge Nesne Modeli Örnekleri:
  1. Node.js'de Barındırma Nesneleri :

3

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


1

Üç 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.


0

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:

  • native == "standart"
  • host == tarayıcı veya Düğüm tarafından sağlanır veya…
  • çoğu ana bilgisayar nesnesi yereldir ve ana bilgisayar olmayan tüm nesneler de yereldir

Orada biraz raylardan çıktın. "Çoğu ana bilgisayar nesnesi yereldir" yanlıştır. Aslında, tanım gereği TÜM ana bilgisayar nesneleri yerel DEĞİLDİR. Doğal, elbette "standart" anlamına gelir, ancak sıra dışı anlamında standart değil, dil spesifikasyonunda standart anlamına gelir. JavaScript (ECMASCript), Dize, Tarih, MATH, Boolean, Sayı, JSON ve XmlHTTP gibi tarayıcılar ve diğer ana bilgisayarlar tarafından uygulanan çeşitli arayüzleri / API'leri tanımlar. Bu nesneler, ana bilgisayar ECMAScript uyumlu bir motor uyguladığından ve ECMA standardını karşıladığından kullanılabilir.
Scott Marcus

0

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.

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.