Tôi tình cờ học được nguyên mẫu từ You Do not know JS: this & Object Prototypes , đây là một cuốn sách tuyệt vời để hiểu thiết kế bên dưới và làm rõ rất nhiều quan niệm sai lầm (đó là lý do tại sao tôi đang cố gắng tránh sử dụng tính kế thừa và những thứ như thế instanceof
).
Nhưng tôi có câu hỏi tương tự như mọi người hỏi ở đây. Một số câu trả lời thực sự hữu ích và khai sáng. Tôi cũng muốn chia sẻ những hiểu biết của tôi.
Nguyên mẫu là gì?
Các đối tượng trong JavaScript có một thuộc tính bên trong, được ký hiệu trong đặc tả là [[Prototype]]
, nó chỉ đơn giản là một tham chiếu đến một đối tượng khác. Hầu như tất cả các đối tượng được cung cấp một null
giá trị phi cho tài sản này, tại thời điểm tạo ra chúng.
Làm thế nào để có được nguyên mẫu của một đối tượng?
thông qua __proto__
hoặcObject.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
Là gì prototype
?
prototype
là một đối tượng được tạo tự động như một thuộc tính đặc biệt của hàm , được sử dụng để thiết lập chuỗi ủy nhiệm (thừa kế), còn gọi là chuỗi nguyên mẫu.
Khi chúng ta tạo một hàm a
, prototype
sẽ tự động được tạo như một thuộc tính đặc biệt a
và lưu mã chức năng trên như constructor
trên prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Tôi muốn coi thuộc tính này là nơi lưu trữ các thuộc tính (bao gồm các phương thức) của một đối tượng hàm. Đó cũng là lý do tại sao chức năng tiện ích trong JS được định nghĩa như thế Array.prototype.forEach()
, Function.prototype.bind()
,Object.prototype.toString().
Tại sao phải nhấn mạnh tính chất của một hàm ?
{}.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();
Vì vậy, Arary
, Function
, Object
là tất cả các chức năng. Tôi nên thừa nhận rằng điều này làm mới ấn tượng của tôi về JS. Tôi biết các hàm là công dân hạng nhất trong JS nhưng có vẻ như nó được xây dựng trên các hàm.
Sự khác biệt giữa __proto__
và là prototype
gì?
__proto__
một tài liệu tham khảo hoạt động trên mọi đối tượng để tham chiếu đến [[Prototype]]
tài sản của nó .
prototype
là một đối tượng được tạo tự động như một thuộc tính đặc biệt của hàm , được sử dụng để lưu trữ các thuộc tính (bao gồm các phương thức) của một đối tượng hàm.
Với hai thứ này, chúng tôi có thể vạch ra một cách tinh thần chuỗi nguyên mẫu. Giống như hình ảnh này minh họa:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
khác vớiconstructor.prototype
?