สิ่งหลังอ้างถึงออบเจ็กต์ฟังก์ชัน nonprimitive ที่ถูกสร้างขึ้นโดยตัวสร้างที่กำหนดเอง (เช่น var bird1 = new Bird ();) หรือไม่
:)
สิ่งหลังอ้างถึงออบเจ็กต์ฟังก์ชัน nonprimitive ที่ถูกสร้างขึ้นโดยตัวสร้างที่กำหนดเอง (เช่น var bird1 = new Bird ();) หรือไม่
:)
คำตอบ:
ข้อกำหนดทั้งสองถูกกำหนดไว้ในข้อกำหนด 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...
host objectอธิบายไว้ในคำตอบนี้
'Object'หรือนำเสนอผ่านทางเป็นObject.prototype.toString '[object Object]'
Birdเป็นฟังก์ชันที่ผู้ใช้กำหนดความหมายของมันจะถูก"กำหนดอย่างสมบูรณ์"โดยข้อกำหนด ES (วิธีการทำงานของวัตถุฟังก์ชันวิธีการสร้างการดำเนินการใช้กับตัวnewดำเนินการ ฯลฯ ฯลฯ ฯลฯ ) มันเป็นวัตถุพื้นเมือง ... ฉันอาจจะตอบ ...
จะชัดเจนยิ่งขึ้นหากเราแยกแยะระหว่างวัตถุสามชนิด:
Built-in วัตถุ : String, Math, RegExp, Object, Functionฯลฯ - วัตถุหลักที่กำหนดไว้ล่วงหน้าเสมอที่สามารถใช้ได้ใน JavaScript กำหนดไว้ในข้อกำหนด ECMAScript
วัตถุโฮสต์ : วัตถุชอบwindow, XmlHttpRequestต่อมน้ำ DOM และอื่น ๆ ที่ให้บริการโดยสภาพแวดล้อมที่เบราว์เซอร์ พวกมันแตกต่างจากอ็อบเจ็กต์ในตัวเนื่องจากไม่ใช่ทุกสภาพแวดล้อมที่จะมีอ็อบเจ็กต์โฮสต์เดียวกัน หาก JavaScript ทำงานนอกเบราว์เซอร์ตัวอย่างเช่นเป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์เช่นใน Node.js อ็อบเจ็กต์โฮสต์ที่แตกต่างกันจะพร้อมใช้งาน
วัตถุผู้ใช้ : วัตถุที่กำหนดในรหัส JavaScript ดังนั้น 'Bird' ในตัวอย่างของคุณจะเป็นวัตถุของผู้ใช้
กลุ่ม JavaScript สเป็คในตัววัตถุและการใช้วัตถุกันเป็นวัตถุพื้นเมือง นี่เป็นการใช้คำว่า "เนทีฟ" อย่างไม่เป็นธรรมเนื่องจากเห็นได้ชัดว่าวัตถุของผู้ใช้ถูกนำไปใช้ใน JavaScript ในขณะที่บิวท์อินมักจะถูกนำไปใช้ในภาษาอื่นภายใต้ประทุนเช่นเดียวกับออบเจ็กต์โฮสต์ แต่จากมุมมองของข้อมูลจำเพาะของ JavaScript ทั้งบิวอินและอ็อบเจ็กต์ผู้ใช้เป็นของ JavaScript เนื่องจากมีการกำหนดไว้ในข้อมูลจำเพาะของ JavaScript ในขณะที่อ็อบเจ็กต์โฮสต์ไม่ได้
นี่คือความเข้าใจของฉันเกี่ยวกับข้อมูลจำเพาะ
นี้:
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"
สิ่งนี้ช่วยให้นักออกแบบการใช้งานมีความยืดหยุ่นในการปรับใช้ให้เหมาะสมกับความต้องการเฉพาะของสภาพแวดล้อม
มีข้อกำหนดของโฮสต์อ็อบเจ็กต์ที่กำหนดไว้ตลอดสเป็ค
birdและBirdเป็นวัตถุดั้งเดิมเป็นฟังก์ชันที่ผู้ใช้กำหนดเอง ( Bird) และวัตถุ ( bird) ที่สร้างขึ้นโดยการใช้ฟังก์ชันเป็นตัวสร้างความหมายทั้งหมดของสิ่งนี้ถูกกำหนดไว้ในข้อมูลจำเพาะ เกี่ยวกับโฮสต์อ็อบเจ็กต์อย่าพึ่งพา[[Class]]คุณสมบัติภายในมากเกินไปเช่นwindow.alertมี"Function"มูลค่า[[Class]]การใช้งานเกือบทั้งหมดบน IE "Object"และยังคงเป็นวัตถุโฮสต์ ...
[[Class]]มากเกินไป แทนที่จะใช้เป็นเพียงภาพรวมที่จับต้องได้ว่าผู้ปฏิบัติงานตีความวัตถุประเภทต่างๆอย่างไร ดังนั้นแล้วwindow.alertการมีภายใน[[Class]]ของ"Function"ก็ดูเหมือนจะละเมิด ES 5 หรือไม่?
divs/NodeListนั้นฉันจะได้objectไฟล์. ฉันเดาว่าฉันยังไม่เข้าใจสิ่งนี้ แต่นั่นจะไม่ทำให้มันเป็นวัตถุดั้งเดิมหรือ?
นอกเหนือจากคำตอบอื่น ๆ เกี่ยวกับ Host Objects
โฮสต์อ็อบเจ็กต์เฉพาะสำหรับสภาวะแวดล้อม ถัดจากวัตถุโฮสต์ของเบราว์เซอร์ยังมีวัตถุเฉพาะใน nodejs
เพื่อประโยชน์ของตัวอย่างอันดับแรกเริ่มต้นด้วยอ็อบเจ็กต์มาตรฐานตามที่กำหนดไว้ใน Javascript จากนั้นวัตถุทั่วไปสำหรับเบราว์เซอร์ / DOM โหนดมีวัตถุของตัวเอง
ไม่เห็นคำตอบที่น่าเชื่อถือสำหรับคำถามว่า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
พิจารณาสามออบเจ็กต์: Host, Native, Custom
โฮสต์ออบเจ็กต์ถูกสร้างขึ้นโดยสภาพแวดล้อมและเป็นสภาวะแวดล้อมเฉพาะ สภาพแวดล้อมที่รู้จักกันดีที่สุดคือเว็บเบราว์เซอร์ แต่อาจเป็นแพลตฟอร์มอื่น วัตถุโฮสต์ที่สร้างในเว็บเบราว์เซอร์อาจเป็นวัตถุหน้าต่างหรือเอกสาร โดยทั่วไปแล้วเบราว์เซอร์จะใช้ API เพื่อสร้าง Host Objects เพื่อสะท้อน Document Object Model ไปยัง JavaScript (เว็บเบราว์เซอร์มี JavaScript Engines ที่แตกต่างกัน) อ็อบเจ็กต์โฮสต์ถูกสร้างขึ้นโดยอัตโนมัติทันทีที่เพจแสดงผลในเบราว์เซอร์
Native Object ถูกสร้างขึ้นโดยนักพัฒนาโดยใช้คลาส JavaScript ที่กำหนดไว้ล่วงหน้า Native Objects อยู่ในสคริปต์ที่คุณเขียนขึ้น
นักพัฒนาจะสร้างวัตถุแบบกำหนดเองจากคลาสที่กำหนดเอง (ไม่ได้กำหนดไว้ล่วงหน้าหรือกำหนดไว้ล่วงหน้าบางส่วน)
เนทีฟอ็อบเจกต์คืออ็อบเจกต์ที่เป็นไปตามข้อกำหนดนั่นคือ "อ็อบเจ็กต์มาตรฐาน"
โฮสต์อ็อบเจ็กต์คืออ็อบเจ็กต์ที่เบราว์เซอร์ (หรือสภาพแวดล้อมรันไทม์อื่น ๆ เช่น Node) จัดเตรียมไว้ให้
อ็อบเจ็กต์โฮสต์ส่วนใหญ่เป็นอ็อบเจ็กต์ดั้งเดิมและเมื่อใดก็ตามที่คุณสร้างอินสแตนซ์บางสิ่งโดยใช้newคุณมั่นใจได้ 99.99% ว่าเป็นอ็อบเจ็กต์ดั้งเดิมเว้นแต่คุณจะยุ่งกับวัตถุโฮสต์แปลก ๆ
ความคิดนี้ได้รับการแนะนำให้รู้จักเพราะการปรากฏตัวของวัตถุที่แปลกประหลาดมากใน IE (และเบราว์เซอร์เก่าอื่น ๆ ?) ตัวอย่างเช่น:
typeof document.all == "undefined"; // true
document.all.myElementId; // object
เมื่อเห็นสิ่งนี้ทุกคนจะยอมรับdocument.allอย่างชัดเจนว่า "ไม่ได้มาตรฐาน" และเป็นวัตถุโฮสต์ที่ไม่ใช่เจ้าของ
แล้วทำไมไม่เรียกวัตถุมาตรฐานดั้งเดิมตั้งแต่แรก? ง่าย ๆ : ท้ายที่สุดแล้วเอกสารStandard (!) ก็พูดถึงวัตถุที่ไม่ใช่ของพื้นเมืองเช่นกันและการเรียกสิ่งเหล่านี้ว่าไม่เป็นมาตรฐานจะนำไปสู่ความขัดแย้ง
อีกครั้ง:
สิ่งนี้อาจจะมากเกินไป แต่เพื่อความเรียบง่ายออบเจ็กต์ดั้งเดิมคือสิ่งที่มีอยู่และสามารถใช้งานได้ในทุกสภาพแวดล้อมที่ใช้เอ็นจิ้นที่สอดคล้องกับ ECMAScript โดยปกติจะเป็นเบราว์เซอร์ (แต่ไม่เสมอไป)
ดังนั้น Internet Explorer ของคุณหรือ Google Chrome ของคุณจะไม่ทำให้ออบเจ็กต์ String พร้อมใช้งานสำหรับคุณตัวอย่างเช่น เหตุผลที่คุณสามารถใช้ออบเจ็กต์ String ได้เนื่องจากเป็น "เนทีฟ" (ในตัว) สำหรับภาษา JavaScript เอง
อย่างไรก็ตามหากคุณต้องการสร้างหน้าต่างป๊อปอัปคุณจะต้องใช้วัตถุหน้าต่าง อ็อบเจ็กต์หน้าต่างจัดเตรียมโดยซอฟต์แวร์เบราว์เซอร์เองดังนั้นจึงไม่ได้มาจาก JavaScript แต่เป็นส่วนหนึ่งของ "Browser Object Model" หรือ BOM