ฉันเป็นต้นแบบการเรียนรู้จากคุณไม่รู้ JS: นี่คือ & วัตถุต้นแบบซึ่งเป็นหนังสือที่ยอดเยี่ยมที่จะเข้าใจการออกแบบภายใต้และชี้แจงความเข้าใจที่คลาดเคลื่อนมากมาย (นั่นคือเหตุผลที่ฉันพยายามหลีกเลี่ยงการใช้มรดกและสิ่งต่าง ๆ เช่นinstanceof
)
แต่ฉันมีคำถามเดียวกันกับที่คนถามกันที่นี่ คำตอบหลายคำตอบมีประโยชน์และให้ความรู้อย่างแท้จริง ฉันชอบที่จะแบ่งปันความเข้าใจของฉัน
ต้นแบบคืออะไร
วัตถุใน JavaScript มีคุณสมบัติภายในซึ่งแสดงในข้อมูลจำเพาะ[[Prototype]]
ซึ่งเป็นเพียงการอ้างอิงไปยังวัตถุอื่น วัตถุเกือบทั้งหมดได้รับnull
ค่าที่ไม่ใช่มูลค่าสำหรับคุณสมบัตินี้ ณ เวลาที่สร้างขึ้น
วิธีรับต้นแบบของวัตถุ?
ผ่าน__proto__
หรือObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
คือprototype
อะไร
prototype
เป็นวัตถุที่สร้างขึ้นโดยอัตโนมัติเป็นคุณสมบัติพิเศษของฟังก์ชั่นซึ่งใช้ในการสร้างห่วงโซ่การมอบหมาย (มรดก) ห่วงโซ่ต้นแบบหรือที่รู้จัก
เมื่อเราสร้างฟังก์ชั่นa
, prototype
ถูกสร้างโดยอัตโนมัติเป็นคุณสมบัติพิเศษในa
และบันทึกรหัสฟังก์ชั่นในขณะที่บนconstructor
prototype
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
ฉันชอบที่จะพิจารณาคุณสมบัตินี้เป็นสถานที่ในการจัดเก็บคุณสมบัติ (รวมถึงวิธีการ) ของวัตถุฟังก์ชั่น นั่นเป็นเหตุผลที่ว่าทำไมฟังก์ชันอรรถประโยชน์ใน JS มีการกำหนดไว้เช่นArray.prototype.forEach()
, Function.prototype.bind()
,Object.prototype.toString().
ทำไมต้องเน้นคุณสมบัติของฟังก์ชั่น ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
ดังนั้นArary
, Function
, Object
ฟังก์ชั่นทั้งหมด ฉันควรยอมรับว่านี่เป็นการรีเฟรชการแสดงผลของฉันใน JS ฉันรู้ว่าฟังก์ชั่นเป็นพลเมืองอันดับหนึ่งใน JS แต่ดูเหมือนว่ามันสร้างขึ้นจากฟังก์ชั่น
ความแตกต่างระหว่าง__proto__
และprototype
คืออะไร
__proto__
การอ้างอิงทำงานบนทุกวัตถุเพื่ออ้างถึง[[Prototype]]
คุณสมบัติของมัน
prototype
เป็นวัตถุที่สร้างขึ้นโดยอัตโนมัติเป็นคุณสมบัติพิเศษของฟังก์ชั่นซึ่งใช้ในการจัดเก็บคุณสมบัติ (รวมถึงวิธีการ) ของฟังก์ชั่นวัตถุ
ด้วยสองสิ่งนี้เราสามารถแมปเชนต้นแบบได้ เหมือนภาพนี้แสดงให้เห็น:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
แตกต่างจากconstructor.prototype
?