Apa perbedaan antara objek asli dan objek host?

90

Apakah yang terakhir hanya merujuk ke objek fungsi nonprima yang dibuat oleh konstruktor kustom (misalnya, var bird1 = new Bird ();)?

ppecher
sumber
2
Objek asli didefinisikan dalam spesifikasi ECMAScript, sedangkan objek host tidak.
Šime Vidas
6
Elemen DOM - katakanlah, new Image()- adalah objek host, misalnya.
@ ŠimeVidas: Adakah alasan Anda meninggalkan komentar yang bertentangan dengan jawaban Anda?
pengguna113716
@ Ӫ _._ Ӫ Itu yang saya :)
sukai
1
@ ŠimeVidas: Komentar Anda menyatakan bahwa objek host tidak ditentukan dalam spesifikasi ECMAScript . Jawaban Anda menyatakan "Definisi untuk keduanya ada dalam spesifikasi ECMAScript" .
pengguna113716

Jawaban:

133

Kedua istilah tersebut didefinisikan dalam spesifikasi ECMAScript:

objek asli

objek dalam implementasi ECMAScript yang semantiknya sepenuhnya ditentukan oleh spesifikasi ini, bukan oleh lingkungan host.

CATATAN Objek asli standar ditentukan dalam spesifikasi ini. Beberapa objek asli sudah ada di dalamnya; yang lain mungkin dibuat selama pelaksanaan program ECMAScript.

Sumber: http://es5.github.com/#x4.3.6

objek host

objek yang disediakan oleh lingkungan host untuk menyelesaikan lingkungan eksekusi ECMAScript.

CATATAN Setiap objek yang bukan asli adalah objek host.

Sumber: http://es5.github.com/#x4.3.8


Beberapa contoh:

Benda asli: Object(konstruktor), Date, Math, parseInt, eval, metode string seperti indexOfdan replace, metode array, ...

Tuan rumah benda (dengan asumsi lingkungan browser): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...

Šime Vidas
sumber
8
berikan dia beberapa contoh juga, objek asli: Array, String .., host object: window ...
Poelinca Dorin
1
bagaimana dengan custom custructor? misalnya, contoh burung di posting saya
ppecher
2
@ ŠimeVidas: "Maka itu adalah objek host." Itu tidak benar. Lihat definisi yang host objectdijelaskan dalam jawaban ini .
pengguna113716
1
ŠimeVidas: Tetapi spesifikasi menyatakan 'Nilai properti internal [[Class]] dari objek host dapat berupa nilai String apa pun kecuali salah satu dari "Arguments", "Array", "Boolean", "Date", "Error", "Fungsi", "JSON", "Matematika", "Angka", "Objek" , "Ekspresi Reguler", dan "String". ' Properti internal [[Class]] dari objek Bird Anda akan 'Object', atau disajikan melalui Object.prototype.toStringsebagai '[object Object]'.
pengguna113716
2
@ ŠimeVidas, saya tidak setuju, jika Birdadalah fungsi yang ditentukan pengguna, semantiknya "sepenuhnya ditentukan" oleh spesifikasi ES (cara kerja objek fungsi, cara newmembuatnya , dieksekusi, digunakan dengan operator, dll, dll., Dll.) objek asli ... Saya mungkin memberikan jawaban ...
Christian C. Salvadó
28

Lebih jelasnya jika kita membedakan tiga macam objek:

Built-in objek : String, Math, RegExp, Object, Functiondll - inti ditentukan sebelumnya benda selalu tersedia di JavaScript. Didefinisikan dalam spesifikasi ECMAScript.

Objek host : objek seperti window,, XmlHttpRequestsimpul DOM dan sebagainya, yang disediakan oleh lingkungan browser. Mereka berbeda dari objek built-in karena tidak semua lingkungan memiliki objek host yang sama. Jika JavaScript berjalan di luar browser, misalnya sebagai bahasa skrip sisi server seperti di Node.js, objek host yang berbeda akan tersedia.

Objek pengguna : objek yang ditentukan dalam kode JavaScript. Jadi 'Bird' dalam contoh Anda akan menjadi objek pengguna.

Spesifikasi JavaScript mengelompokkan objek bawaan dan objek pengguna sebagai objek asli . Ini adalah penggunaan istilah "asli" yang tidak ortodoks, karena objek pengguna jelas-jelas diimplementasikan dalam JavaScript sementara built-in kemungkinan besar diimplementasikan dalam bahasa yang berbeda di bawah tenda, seperti halnya objek host. Namun dari perspektif spesifikasi JavaScript, baik bawaan maupun objek pengguna adalah bawaan JavaScript karena keduanya ditentukan dalam spesifikasi JavaScript, sedangkan objek host tidak.

JacquesB
sumber
Objek asli merujuk ke objek yang dibuat dengan implementasi javascript (mesin). Perbedaan antara objek bawaan dan bawaan lainnya (objek pengguna) adalah bahwa objek sebelumnya sudah ada sejak awal program javascript yang mematuhi aturan ECMA yang relevan. Sejak ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), ia tidak menggunakan terminologi di atas untuk mengklasifikasikan objek. Lihat jawaban saya di bawah ini.
jaaw
17

Berikut pemahaman saya tentang speknya.

Ini:

var bird = new Bird();

... menghasilkan Objek asli yang kebetulan dibuat menggunakan newoperator.

Objek asli memiliki properti [[Class]] internal dari salah satu dari berikut ini:

"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", dan "String" .

Untuk Anda bird1itu akan menjadi:

"Obyek"

Sama seperti jika Anda membuat fungsi:

function my_func() {
    // ...
}

... my_functidak ditentukan dalam ECMAScript, tetapi masih merupakan objek asli dengan [[Class]] internal:

"Fungsi"

Objek host adalah objek yang disediakan oleh lingkungan untuk melayani tujuan tertentu ke lingkungan yang tidak ditentukan dalam spesifikasi.

Sebagai contoh:

var divs = document.getElementsByTagName('div')

Objek yang direferensikan divsadalah NodeList , yang diintegrasikan ke dalam lingkungan sedemikian rupa sehingga terasa seperti objek JavaScript biasa, namun tidak ditentukan di mana pun oleh spesifikasi.

Properti [[Class]] internalnya adalah:

"NodeList"

Ini memberikan desainer implementasi beberapa fleksibilitas dalam menyesuaikan implementasi dengan kebutuhan spesifik lingkungan.

Ada persyaratan objek host yang ditentukan di seluruh spesifikasi.

pengguna113716
sumber
2
+1, saya setuju dengan Anda, birddan Birdmerupakan objek asli , mereka adalah fungsi yang ditentukan pengguna ( Bird), dan objek ( bird) yang dibuat dengan menggunakan fungsi sebagai konstruktor, semua semantik ini ditentukan pada spesifikasi. Tentang objek host, jangan terlalu mengandalkan [[Class]]properti internal, misalnya window.alertmemiliki "Function"nilai [[Class]]propertinya hampir semua implementasi, di IE yang dimilikinya "Object", dan itu masih objek host ...
Christian C. Salvadó
Terima kasih @CMS. Ya, saya tidak bermaksud terlalu menekankan pada penggunaan internal [[Class]]. Alih-alih hanya menggunakannya sebagai kilasan nyata tentang bagaimana pelaksana telah menafsirkan berbagai jenis objek. Jadi window.alertmemiliki internal [[Class]]dari "Function"tampaknya akan menjadi pelanggaran ES 5?
pengguna113716
Saya mencoba untuk melihat aksi ain ini, tetapi jika saya mendapatkan tipe div itu divs/NodeList,, saya mendapatkan object. Saya rasa saya belum mengerti ini, tapi bukankah itu membuatnya menjadi objek asli?
Mark B
Ini membantu . Mendapatkan semuanya di windowacara semua objek tuan rumah
Mark B
Bird bukanlah objek asli karena antarmukanya tidak sepenuhnya dijelaskan dalam standar ECMASCript. Sesederhana itu. Objek adalah asli dan String adalah asli, tetapi objek yang ditentukan pengguna atau yang ditentukan host bukan asli.
Scott Marcus
3

Tidak dapat melihat jawaban yang meyakinkan untuk pertanyaan apakah objek var bird1 = new Bird();asli atau host. Dengan asumsi Bird adalah fungsi yang ditentukan pengguna, objek non-built-in asli akan dibuat sesuai dengan http://es5.github.io/#x13.2 oleh implementasi javascript. Sebaliknya, bawaan bawaanobjek akan hadir sejak awal program javascript (seperti Objek dan banyak lainnya). Perbedaan antara objek asli dan objek host adalah bahwa objek pertama dibuat oleh implementasi javascript dan objek host disediakan oleh lingkungan host. Akibatnya, properti [[class]] objek host internal dapat berbeda dari yang digunakan oleh objek bawaan (yaitu "Argumen", "Array", "Boolean", "Tanggal", "Kesalahan", "Fungsi", " JSON "," Matematika "," Angka "," Objek "," RegExp ", dan" String ").

Juga, perlu diperhatikan bahwa ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf tidak lagi menggunakan terminologi native dan objek host. Sebaliknya, ia mendefinisikan tipe objek di bawah ini, dengan penjelasan yang lebih jelas tentang perilaku yang diinginkan.

4.3.6 benda biasa

objek yang memiliki perilaku default untuk metode internal penting yang harus didukung oleh semua objek

4.3.7 benda eksotis

objek yang tidak memiliki perilaku default untuk satu atau lebih metode internal penting yang harus didukung oleh semua objek CATATAN Setiap objek yang bukan objek biasa adalah objek eksotik.

4.3.8 objek standar

objek yang semantiknya ditentukan oleh spesifikasi ini

4.3.9 objek bawaan

objek yang ditentukan dan disediakan oleh implementasi ECMAScript

rahang
sumber
3

Selain jawaban lain tentang Objek Host.

Objek host dikhususkan untuk lingkungan. Jadi selanjutnya objek host browser, ada juga objek khusus untuk nodejs.

Demi contoh, pertama-tama mulai dengan objek Standar seperti yang didefinisikan dalam Javascript. Kemudian objek umum untuk Browser / DOM. Node memiliki Objeknya sendiri.

  1. Contoh objek bawaan Javascript standar :

  2. Contoh Model Objek Dokumen Objek Host :

  3. Objek Host di Node.js :

Remi
sumber
1

Mempertimbangkan tiga objek: Host, Native, Custom.

Objek Host dibuat oleh lingkungan dan khusus lingkungan. Lingkungan yang paling terkenal adalah browser web tetapi bisa menjadi platform lain. Objek host yang dibuat di browser web dapat berupa objek jendela atau dokumen. Biasanya browser menggunakan API untuk membuat Objek Host untuk mencerminkan Model Objek Dokumen ke dalam JavaScript. (Webbrowser memiliki Mesin JavaScript berbeda yang melakukan ini) Objek host dibuat secara otomatis saat halaman dirender di browser.

Objek Asli dibuat oleh pengembang menggunakan kelas JavaScript yang telah ditentukan sebelumnya. Objek Asli ada dalam skrip tertulis Anda.

Kemudian, Objek Kustom dibuat oleh pengembang dari kelas kustom (tidak ditentukan sebelumnya, atau sebagian ditentukan sebelumnya).

Khamaseen
sumber
0

Objek asli adalah objek yang mengikuti spesifikasi, yaitu "objek standar".

Objek host adalah objek yang disediakan browser (atau lingkungan runtime lain seperti Node).

Sebagian besar objek host adalah objek native, dan setiap kali Anda membuat instance sesuatu menggunakan new, Anda dapat 99,99% yakin bahwa itu adalah objek native, kecuali jika Anda mengotak-atik objek host yang aneh.

Gagasan ini diperkenalkan karena adanya objek yang sangat aneh di IE (dan browser lama lainnya?) . Sebagai contoh:

typeof document.all == "undefined"; // true
document.all.myElementId; // object

Saat melihat ini, semua orang akan setuju bahwa document.allini jelas "non-standar", dan dengan demikian merupakan objek host non-native .

Jadi mengapa tidak memanggil objek asli objek standar di tempat pertama? Sederhana: bagaimanapun, dokumen Standard (!) Berbicara tentang objek non-native juga, dan menyebutnya non-standar akan menyebabkan paradoks.

Lagi:

  • native == "standar"
  • host == disediakan oleh browser atau Node atau…
  • sebagian besar objek host adalah native, dan semua objek non-host juga native
pengguna123444555621
sumber
Anda telah keluar dari rel sedikit di sana. "Sebagian besar objek host adalah asli" salah. Faktanya, menurut definisi SEMUA objek host BUKAN native. Native artinya “standar” pasti, tapi artinya standar dalam spesifikasi bahasanya, bukan standar dalam artian di luar kebiasaan. JavaScript (ECMASCript) mendefinisikan beberapa antarmuka / API yang diimplementasikan oleh browser dan host lain, seperti: String, Date, MATH, Boolean, Number, JSON dan XmlHTTP. Objek ini tersedia karena host mengimplementasikan mesin yang sesuai dengan ECMAScript dan memenuhi standar ECMA.
Scott Marcus
0

Ini mungkin berlebihan, tetapi untuk kesederhanaan, objek asli adalah objek yang ada dan dapat digunakan di lingkungan apa pun yang mengimplementasikan mesin yang sesuai dengan ECMAScript. Ini biasanya (tetapi tidak selalu) browser.

Jadi, Internet Explorer atau Google Chrome Anda, tidak membuat objek String tersedia untuk Anda, misalnya. Alasan Anda dapat menggunakan objek String adalah karena itu "asli" (bawaan) untuk bahasa JavaScript itu sendiri.

Namun, jika Anda ingin membuat jendela pop-up, Anda harus menggunakan objek jendela. Objek jendela disediakan oleh perangkat lunak browser itu sendiri, jadi ini bukan asli JavaScript, tetapi merupakan bagian dari "Model Objek Browser" atau BOM.

Scott Marcus
sumber