อะไรคือความแตกต่างระหว่างวัตถุดั้งเดิมและวัตถุโฮสต์?


91

สิ่งหลังอ้างถึงออบเจ็กต์ฟังก์ชัน nonprimitive ที่ถูกสร้างขึ้นโดยตัวสร้างที่กำหนดเอง (เช่น var bird1 = new Bird ();) หรือไม่


2
วัตถุดั้งเดิมถูกกำหนดไว้ในข้อกำหนด ECMAScript วัตถุโฮสต์ไม่ได้
Šime Vidas

6
องค์ประกอบ DOM เช่นnew Image()- เป็นวัตถุโฮสต์

@ ŠimeVidas: มีเหตุผลบางอย่างที่คุณแสดงความคิดเห็นที่ขัดแย้งกับคำตอบของคุณหรือไม่?
user113716

@ Ӫ _._ Ӫนั่นคือสิ่งที่ฉันตอนนี้:)
Šime Vidas

1
@ ŠimeVidas: รัฐความคิดเห็นของคุณที่วัตถุโฮสต์ไม่ได้กำหนดไว้ในข้อกำหนด ECMAScript คำตอบของคุณกล่าวว่า "คำจำกัดความของทั้งสองอยู่ใน specfication ECMAScript"
user113716

คำตอบ:


135

ข้อกำหนดทั้งสองถูกกำหนดไว้ในข้อกำหนด ECMAScript:

วัตถุดั้งเดิม

อ็อบเจ็กต์ในการใช้งาน ECMAScript ซึ่งมีการกำหนดความหมายโดยสมบูรณ์โดยข้อกำหนดนี้แทนที่จะเป็นโดยสภาพแวดล้อมโฮสต์

หมายเหตุออบเจ็กต์เนทีฟมาตรฐานถูกกำหนดไว้ในข้อกำหนดนี้ วัตถุพื้นเมืองบางอย่างมีอยู่ในตัว ผู้อื่นอาจถูกสร้างขึ้นระหว่างการดำเนินการของโปรแกรม ECMAScript

ที่มา: http://es5.github.com/#x4.3.6

วัตถุโฮสต์

อ็อบเจ็กต์ที่จัดหาโดยสภาพแวดล้อมโฮสต์เพื่อทำให้สภาพแวดล้อมการดำเนินการของ ECMAScript

หมายเหตุอ็อบเจ็กต์ใด ๆ ที่ไม่ใช่เนทีฟเป็นอ็อบเจ็กต์โฮสต์

ที่มา: http://es5.github.com/#x4.3.8


ตัวอย่างบางส่วน:

วัตถุแม่: Object(คอนสตรัค) Date, Math, parseInt, evalวิธีการสายเช่นindexOfและreplaceวิธีการอาร์เรย์ ...

วัตถุโฮสต์ (สมมติว่าสภาพแวดล้อมของเบราว์เซอร์): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll...


8
ยกตัวอย่างให้เขาด้วยเช่นเนทีฟ object: Array, String .. , host object: window ...
Poelinca Dorin

1
แล้ว Custructor ที่กำหนดเองล่ะ? เช่นตัวอย่างนกในโพสต์ของฉัน
ppecher

2
@ ŠimeVidas: "ถ้าอย่างนั้นก็เป็นวัตถุโฮสต์" ไม่ถูกต้อง ดูคำจำกัดความที่host objectอธิบายไว้ในคำตอบนี้
user113716

1
ŠimeVidas: แต่คุณสมบัติระบุ'ค่าของคุณสมบัติภายใน [[Class]] ของวัตถุโฮสต์อาจเป็นค่าสตริงใดก็ได้ยกเว้น "อาร์กิวเมนต์", "อาร์เรย์", "บูลีน", "วันที่", "ข้อผิดพลาด", "Function", "JSON", "Math", "Number", "Object" , "RegExp" และ "String" ภายใน [[ชั้น]] คุณสมบัติของวัตถุนกของคุณจะถูก'Object'หรือนำเสนอผ่านทางเป็นObject.prototype.toString '[object Object]'
user113716

2
@ ŠimeVidasฉันไม่เห็นด้วยถ้าBirdเป็นฟังก์ชันที่ผู้ใช้กำหนดความหมายของมันจะถูก"กำหนดอย่างสมบูรณ์"โดยข้อกำหนด ES (วิธีการทำงานของวัตถุฟังก์ชันวิธีการสร้างการดำเนินการใช้กับตัวnewดำเนินการ ฯลฯ ฯลฯ ฯลฯ ) มันเป็นวัตถุพื้นเมือง ... ฉันอาจจะตอบ ...
Christian C. Salvadó

28

จะชัดเจนยิ่งขึ้นหากเราแยกแยะระหว่างวัตถุสามชนิด:

Built-in วัตถุ : String, Math, RegExp, Object, Functionฯลฯ - วัตถุหลักที่กำหนดไว้ล่วงหน้าเสมอที่สามารถใช้ได้ใน JavaScript กำหนดไว้ในข้อกำหนด ECMAScript

วัตถุโฮสต์ : วัตถุชอบwindow, XmlHttpRequestต่อมน้ำ DOM และอื่น ๆ ที่ให้บริการโดยสภาพแวดล้อมที่เบราว์เซอร์ พวกมันแตกต่างจากอ็อบเจ็กต์ในตัวเนื่องจากไม่ใช่ทุกสภาพแวดล้อมที่จะมีอ็อบเจ็กต์โฮสต์เดียวกัน หาก JavaScript ทำงานนอกเบราว์เซอร์ตัวอย่างเช่นเป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์เช่นใน Node.js อ็อบเจ็กต์โฮสต์ที่แตกต่างกันจะพร้อมใช้งาน

วัตถุผู้ใช้ : วัตถุที่กำหนดในรหัส JavaScript ดังนั้น 'Bird' ในตัวอย่างของคุณจะเป็นวัตถุของผู้ใช้

กลุ่ม JavaScript สเป็คในตัววัตถุและการใช้วัตถุกันเป็นวัตถุพื้นเมือง นี่เป็นการใช้คำว่า "เนทีฟ" อย่างไม่เป็นธรรมเนื่องจากเห็นได้ชัดว่าวัตถุของผู้ใช้ถูกนำไปใช้ใน JavaScript ในขณะที่บิวท์อินมักจะถูกนำไปใช้ในภาษาอื่นภายใต้ประทุนเช่นเดียวกับออบเจ็กต์โฮสต์ แต่จากมุมมองของข้อมูลจำเพาะของ JavaScript ทั้งบิวอินและอ็อบเจ็กต์ผู้ใช้เป็นของ JavaScript เนื่องจากมีการกำหนดไว้ในข้อมูลจำเพาะของ JavaScript ในขณะที่อ็อบเจ็กต์โฮสต์ไม่ได้


ออบเจ็กต์ดั้งเดิมหมายถึงอ็อบเจ็กต์เหล่านั้นที่สร้างขึ้นโดยการใช้งานจาวาสคริปต์ (เอ็นจิ้น) ความแตกต่างระหว่างอ็อบเจ็กต์ในตัวและเนทีฟอื่น ๆ (อ็อบเจ็กต์ผู้ใช้) คืออ็อบเจ็กต์ในอดีตมีอยู่ตั้งแต่เริ่มโปรแกรมจาวาสคริปต์ที่สอดคล้องกับกฎ ECMA ที่เกี่ยวข้อง เนื่องจาก ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ) จึงไม่ใช้คำศัพท์ข้างต้นในการจำแนกวัตถุ อ้างถึงคำตอบของฉันด้านล่าง
jaaw

17

นี่คือความเข้าใจของฉันเกี่ยวกับข้อมูลจำเพาะ

นี้:

var bird = new Bird();

... ส่งผลให้เป็น Object ดั้งเดิมที่เพิ่งสร้างขึ้นโดยใช้ตัวnewดำเนินการ

ออบเจ็กต์ดั้งเดิมมีคุณสมบัติ [[Class]] ภายในอย่างใดอย่างหนึ่งต่อไปนี้:

"ข้อโต้แย้ง", "อาร์เรย์", "บูลีน", "วัน", "ข้อผิดพลาด", "ฟังก์ชั่น", "JSON", "คณิตศาสตร์", "จำนวน", "วัตถุ", "นิพจน์ทั่วไป" และ "สตริง"

สำหรับคุณbird1จะเป็น:

"วัตถุ"

เช่นเดียวกับถ้าคุณสร้างฟังก์ชัน:

function my_func() {
    // ...
}

... my_funcไม่ได้กำหนดไว้ใน ECMAScript แต่ยังคงเป็นออบเจ็กต์ดั้งเดิมที่มี [[Class]] ภายใน:

"ฟังก์ชัน"

อ็อบเจ็กต์โฮสต์คืออ็อบเจ็กต์ที่จัดเตรียมโดยสภาวะแวดล้อมเพื่อตอบสนองวัตถุประสงค์เฉพาะสำหรับสภาวะแวดล้อมนั้นที่ไม่ได้กำหนดโดยข้อกำหนด

ตัวอย่างเช่น:

var divs = document.getElementsByTagName('div')

วัตถุที่อ้างถึงdivsคือNodeListซึ่งรวมเข้ากับสภาพแวดล้อมในลักษณะที่ให้ความรู้สึกเหมือนเป็นวัตถุ JavaScript ทั่วไป แต่ก็ไม่ได้กำหนดไว้ที่ใดก็ได้โดยข้อกำหนด

คุณสมบัติ [[Class]] ภายในของมันคือ:

"NodeList"

สิ่งนี้ช่วยให้นักออกแบบการใช้งานมีความยืดหยุ่นในการปรับใช้ให้เหมาะสมกับความต้องการเฉพาะของสภาพแวดล้อม

มีข้อกำหนดของโฮสต์อ็อบเจ็กต์ที่กำหนดไว้ตลอดสเป็ค


2
+1 ฉันเห็นด้วยกับคุณbirdและBirdเป็นวัตถุดั้งเดิมเป็นฟังก์ชันที่ผู้ใช้กำหนดเอง ( Bird) และวัตถุ ( bird) ที่สร้างขึ้นโดยการใช้ฟังก์ชันเป็นตัวสร้างความหมายทั้งหมดของสิ่งนี้ถูกกำหนดไว้ในข้อมูลจำเพาะ เกี่ยวกับโฮสต์อ็อบเจ็กต์อย่าพึ่งพา[[Class]]คุณสมบัติภายในมากเกินไปเช่นwindow.alertมี"Function"มูลค่า[[Class]]การใช้งานเกือบทั้งหมดบน IE "Object"และยังคงเป็นวัตถุโฮสต์ ...
Christian C. Salvadó

ขอบคุณ @CMS ใช่ฉันไม่ได้ตั้งใจที่จะให้ความสำคัญกับการใช้งานภายใน[[Class]]มากเกินไป แทนที่จะใช้เป็นเพียงภาพรวมที่จับต้องได้ว่าผู้ปฏิบัติงานตีความวัตถุประเภทต่างๆอย่างไร ดังนั้นแล้วwindow.alertการมีภายใน[[Class]]ของ"Function"ก็ดูเหมือนจะละเมิด ES 5 หรือไม่?
user113716

ฉันกำลังพยายามที่จะเห็นการกระทำที่ไม่ใช่นี้ แต่ถ้าฉันได้รับ div ประเภทdivs/NodeListนั้นฉันจะได้objectไฟล์. ฉันเดาว่าฉันยังไม่เข้าใจสิ่งนี้ แต่นั่นจะไม่ทำให้มันเป็นวัตถุดั้งเดิมหรือ?
Mark B

นี้จะเป็นประโยชน์ การรับทุกอย่างเข้าwindowจะแสดงวัตถุโฮสต์ทั้งหมด
Mark B

Bird ไม่ใช่วัตถุดั้งเดิมเนื่องจากอินเทอร์เฟซไม่ได้อธิบายไว้อย่างครบถ้วนในมาตรฐาน ECMASCript มันง่ายจริงๆ อ็อบเจ็กต์เป็นแบบเนทีฟและสตริงเป็นแบบเนทีฟ แต่อ็อบเจ็กต์ที่ผู้ใช้กำหนดเองหรืออ็อบเจ็กต์ที่โฮสต์กำหนดไม่ใช่เนทีฟ
Scott Marcus

4

นอกเหนือจากคำตอบอื่น ๆ เกี่ยวกับ Host Objects

โฮสต์อ็อบเจ็กต์เฉพาะสำหรับสภาวะแวดล้อม ถัดจากวัตถุโฮสต์ของเบราว์เซอร์ยังมีวัตถุเฉพาะใน nodejs

เพื่อประโยชน์ของตัวอย่างอันดับแรกเริ่มต้นด้วยอ็อบเจ็กต์มาตรฐานตามที่กำหนดไว้ใน Javascript จากนั้นวัตถุทั่วไปสำหรับเบราว์เซอร์ / DOM โหนดมีวัตถุของตัวเอง

  1. ตัวอย่างอ็อบเจ็กต์ในตัวของJavascript มาตรฐาน :
  1. Host Objects Document Object Modelตัวอย่าง:
  1. โฮสต์ออบเจ็กต์ในNode.js :

3

ไม่เห็นคำตอบที่น่าเชื่อถือสำหรับคำถามว่าvar bird1 = new Bird();เป็นวัตถุพื้นเมืองหรือโฮสต์ สมมติว่า Bird เป็นฟังก์ชันที่ผู้ใช้กำหนดเองอ็อบเจ็กต์ที่ไม่ใช่ในตัวจะถูกสร้างขึ้นตามhttp://es5.github.io/#x13.2โดยการใช้งานจาวาสคริปต์ ในทางตรงกันข้ามเนทีฟในตัวออบเจ็กต์จะปรากฏตั้งแต่เริ่มโปรแกรมจาวาสคริปต์ (เช่น Object และอื่น ๆ อีกมากมาย) ความแตกต่างระหว่างออบเจ็กต์เนทีฟและอ็อบเจ็กต์โฮสต์คือก่อนหน้านี้ถูกสร้างขึ้นโดยการใช้งานจาวาสคริปต์และหลังถูกจัดเตรียมโดยสภาพแวดล้อมโฮสต์ ด้วยเหตุนี้คุณสมบัติโฮสต์อ็อบเจ็กต์ภายใน [[คลาส]] อาจแตกต่างจากที่ใช้โดยอ็อบเจ็กต์ในตัว (เช่น "Arguments", "Array", "Boolean", "Date", "Error", "Function", " JSON "," Math "," Number "," Object "," RegExp "และ" String ")

นอกจากนี้ที่น่าสังเกตว่า ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdfไม่ได้ใช้คำศัพท์เฉพาะของออบเจ็กต์และโฮสต์อีกต่อไป แต่จะกำหนดประเภทออบเจ็กต์ด้านล่างพร้อมคำอธิบายที่ชัดเจนยิ่งขึ้นเกี่ยวกับพฤติกรรมที่ตั้งใจไว้

4.3.6 วัตถุธรรมดา

อ็อบเจ็กต์ที่มีลักษณะการทำงานเริ่มต้นสำหรับวิธีการภายในที่สำคัญซึ่งต้องได้รับการสนับสนุนโดยอ็อบเจ็กต์ทั้งหมด

4.3.7 วัตถุแปลกใหม่

อ็อบเจ็กต์ที่ไม่มีลักษณะการทำงานเริ่มต้นสำหรับวิธีการภายในที่สำคัญอย่างน้อยหนึ่งอย่างที่ต้องได้รับการสนับสนุนโดยอ็อบเจ็กต์ทั้งหมดหมายเหตุอ็อบเจ็กต์ใด ๆ ที่ไม่ใช่อ็อบเจ็กต์ธรรมดาเป็นอ็อบเจกต์แปลกใหม่

4.3.8 วัตถุมาตรฐาน

วัตถุที่มีการกำหนดความหมายโดยข้อกำหนดนี้

วัตถุในตัว 4.3.9

วัตถุที่ระบุและจัดหาโดยการใช้งาน ECMAScript


1

พิจารณาสามออบเจ็กต์: Host, Native, Custom

โฮสต์ออบเจ็กต์ถูกสร้างขึ้นโดยสภาพแวดล้อมและเป็นสภาวะแวดล้อมเฉพาะ สภาพแวดล้อมที่รู้จักกันดีที่สุดคือเว็บเบราว์เซอร์ แต่อาจเป็นแพลตฟอร์มอื่น วัตถุโฮสต์ที่สร้างในเว็บเบราว์เซอร์อาจเป็นวัตถุหน้าต่างหรือเอกสาร โดยทั่วไปแล้วเบราว์เซอร์จะใช้ API เพื่อสร้าง Host Objects เพื่อสะท้อน Document Object Model ไปยัง JavaScript (เว็บเบราว์เซอร์มี JavaScript Engines ที่แตกต่างกัน) อ็อบเจ็กต์โฮสต์ถูกสร้างขึ้นโดยอัตโนมัติทันทีที่เพจแสดงผลในเบราว์เซอร์

Native Object ถูกสร้างขึ้นโดยนักพัฒนาโดยใช้คลาส JavaScript ที่กำหนดไว้ล่วงหน้า Native Objects อยู่ในสคริปต์ที่คุณเขียนขึ้น

นักพัฒนาจะสร้างวัตถุแบบกำหนดเองจากคลาสที่กำหนดเอง (ไม่ได้กำหนดไว้ล่วงหน้าหรือกำหนดไว้ล่วงหน้าบางส่วน)


0

เนทีฟอ็อบเจกต์คืออ็อบเจกต์ที่เป็นไปตามข้อกำหนดนั่นคือ "อ็อบเจ็กต์มาตรฐาน"

โฮสต์อ็อบเจ็กต์คืออ็อบเจ็กต์ที่เบราว์เซอร์ (หรือสภาพแวดล้อมรันไทม์อื่น ๆ เช่น Node) จัดเตรียมไว้ให้

อ็อบเจ็กต์โฮสต์ส่วนใหญ่เป็นอ็อบเจ็กต์ดั้งเดิมและเมื่อใดก็ตามที่คุณสร้างอินสแตนซ์บางสิ่งโดยใช้newคุณมั่นใจได้ 99.99% ว่าเป็นอ็อบเจ็กต์ดั้งเดิมเว้นแต่คุณจะยุ่งกับวัตถุโฮสต์แปลก ๆ

ความคิดนี้ได้รับการแนะนำให้รู้จักเพราะการปรากฏตัวของวัตถุที่แปลกประหลาดมากใน IE (และเบราว์เซอร์เก่าอื่น ๆ ?) ตัวอย่างเช่น:

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

เมื่อเห็นสิ่งนี้ทุกคนจะยอมรับdocument.allอย่างชัดเจนว่า "ไม่ได้มาตรฐาน" และเป็นวัตถุโฮสต์ที่ไม่ใช่เจ้าของ

แล้วทำไมไม่เรียกวัตถุมาตรฐานดั้งเดิมตั้งแต่แรก? ง่าย ๆ : ท้ายที่สุดแล้วเอกสารStandard (!) ก็พูดถึงวัตถุที่ไม่ใช่ของพื้นเมืองเช่นกันและการเรียกสิ่งเหล่านี้ว่าไม่เป็นมาตรฐานจะนำไปสู่ความขัดแย้ง

อีกครั้ง:

  • พื้นเมือง == "มาตรฐาน"
  • โฮสต์ == จัดทำโดยเบราว์เซอร์หรือโหนดหรือ ...
  • ออบเจ็กต์โฮสต์ส่วนใหญ่เป็นแบบเนทีฟและอ็อบเจ็กต์ที่ไม่ใช่โฮสต์ทั้งหมดก็เป็นแบบเนทีฟเช่นกัน

คุณได้ออกไปจากรางเล็กน้อยที่นั่น "ออบเจ็กต์โฮสต์ส่วนใหญ่เป็นของเนทีฟ" ไม่ถูกต้อง ในความเป็นจริงตามความหมายวัตถุโฮสต์ทั้งหมดไม่ได้เกิดขึ้นเอง เนทีฟหมายถึง "มาตรฐาน" อย่างแน่นอน แต่หมายถึงมาตรฐานในข้อกำหนดภาษาไม่ใช่มาตรฐานในความหมายที่ผิดปกติ JavaScript (ECMASCript) กำหนดอินเทอร์เฟซ / API หลายตัวที่ใช้งานโดยเบราว์เซอร์และโฮสต์อื่น ๆ เช่น String, Date, MATH, Boolean, Number, JSON และ XmlHTTP อ็อบเจ็กต์เหล่านี้พร้อมใช้งานเนื่องจากโฮสต์ใช้เอ็นจิ้นที่สอดคล้องกับ ECMAScript และเป็นไปตามมาตรฐาน ECMA
Scott Marcus

0

สิ่งนี้อาจจะมากเกินไป แต่เพื่อความเรียบง่ายออบเจ็กต์ดั้งเดิมคือสิ่งที่มีอยู่และสามารถใช้งานได้ในทุกสภาพแวดล้อมที่ใช้เอ็นจิ้นที่สอดคล้องกับ ECMAScript โดยปกติจะเป็นเบราว์เซอร์ (แต่ไม่เสมอไป)

ดังนั้น Internet Explorer ของคุณหรือ Google Chrome ของคุณจะไม่ทำให้ออบเจ็กต์ String พร้อมใช้งานสำหรับคุณตัวอย่างเช่น เหตุผลที่คุณสามารถใช้ออบเจ็กต์ String ได้เนื่องจากเป็น "เนทีฟ" (ในตัว) สำหรับภาษา JavaScript เอง

อย่างไรก็ตามหากคุณต้องการสร้างหน้าต่างป๊อปอัปคุณจะต้องใช้วัตถุหน้าต่าง อ็อบเจ็กต์หน้าต่างจัดเตรียมโดยซอฟต์แวร์เบราว์เซอร์เองดังนั้นจึงไม่ได้มาจาก JavaScript แต่เป็นส่วนหนึ่งของ "Browser Object Model" หรือ BOM

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.