Tôi muốn thử theo cách thủ công khi đi bộ chuỗi nguyên mẫu của một vài đối tượng chỉ để xem những gì tôi tìm thấy trên đường đi. Tuy nhiên, tôi đã bị mắc kẹt trên cái đầu tiên mà tôi đã thử. Dưới đây là các mã:Khó đi theo cách thủ công Chuỗi thử nghiệm
function MyObject() { }
var x = new MyObject();
console.log('--------------------------------------------');
console.log('x.constructor.name: ' + x.constructor.name);
console.log('x.constructor.prototype.constructor.name: ' + x.constructor.prototype.constructor.name);
console.log(x.constructor.prototype === Function.prototype ? 'Good guess.' : 'No, you are wrong.');
console.log(x.constructor === MyObject ? 'Good guess.' : 'No, you are wrong.');
console.log('--------------------------------------------');
Kết quả mã trên trong đầu ra sau trong Công cụ nhà phát triển điều khiển của Google Chrome:
--------------------------------------------
x.constructor.name: MyObject
x.constructor.prototype.constructor.name: MyObject
No, you are wrong.
Good guess.
--------------------------------------------
Nó làm cho cảm giác rằng constructor x là chức năng MyObject, vì x được khởi tạo sử dụng từ khóa mới trên MyObject (từ này theo định nghĩa của hàm tạo). Bởi vì điều này, tôi hiểu dòng đầu tiên của đầu ra (lưu ý: tôi bắt đầu đếm dòng đầu ra từ số không lên). Tuy nhiên, dòng thứ hai làm tôi bối rối. Tôi muốn biết nguyên mẫu của MyObject là gì. Rõ ràng, nó không phải là một đối tượng của chức năng loại, như được chỉ ra bởi dòng thứ 3 của đầu ra, mà nói với tôi rằng tôi là sai. Dòng đầu ra thứ tư chỉ củng cố đầu ra từ dòng đầu tiên. Trên một lưu ý chung hơn, tôi giả định rằng cách chính xác để đi bộ chuỗi nguyên mẫu của một đối tượng sẽ là đi từ đối tượng trong câu hỏi đến constructor của nó, và sau đó từ constructor đến prototype của constructor, giả định rằng điều này tham chiếu cuối cùng không phải là null. Tôi giả định rằng quá trình hai bước này (bao gồm việc đi tới hàm khởi tạo, và sau đó đến nguyên mẫu của hàm tạo) nên được lặp lại cho đến khi một tham chiếu null từ một hàm tạo đến một mẫu thử nghiệm đạt được, do đó biểu thị sự kết thúc của chuỗi nguyên mẫu. Điều này dường như không được làm việc, mặc dù, kể từ khi áp dụng thuật toán này cho kịch bản trên chỉ dẫn đến tham chiếu vòng tròn.
Nói tóm lại, tôi có hai câu hỏi:
- Tại sao x.constructor === x.constructor.prototype.constructor (hoặc, nói cách khác, tại sao các tài liệu tham khảo hình tròn), và những loại một đối tượng là x.constructor.prototype, dù sao (hoặc, nói cách khác, làm thế nào nó có được instantiated/nó đã đến từ đâu)?
- Làm cách nào để thuật toán trên có thể được sửa lại để đi đúng chuỗi nguyên mẫu cho đối tượng x?
Sửa
Tôi đã xem qua một câu hỏi tương tự trên StackOverflow here, nhưng nó không explicity hỏi cách chính xác để đi bộ chuỗi nguyên mẫu. Nó chỉ ra các tham chiếu vòng tròn, mặc dù ...