Giống như class Foo
không phải là chính nó cùng loại với new Foo
, không có lý do gì cho Foo
để có bất kỳ thuộc tính nào bạn gán cho Foo.prototype
. Lý do là một chút khác nhau, nhưng xem xét nó trong một ngôn ngữ khác như java và nó rõ ràng rằng những gì bạn đang cố gắng làm chỉ là không nên làm việc:
class Foo {
public String bar = "analogous to Foo.prototype.bar which is a property of Foo instances";
}
class Baz {
String thisMethodShouldAndWillFail() {
return Foo.bar;
}
String thisIsWhatShouldAndWillWork() {
return (new Foo()).bar;
}
}
Trong javascript, bạn cần sửa ý tưởng của bạn về những gì một nguyên mẫu và cách nó liên quan đến các đối tượng và các nhà xây dựng, hoặc bạn sẽ gặp phải các vấn đề liên tục. Một số foo
có một nguyên mẫu, nhưng nguyên mẫu đó là không phải làfoo.prototype
. Có không có thuộc tính của foo
chính nó là nguyên mẫu của nó. Nguyên mẫu của foo
được xác định bởi hàm tạo của nóFoo
; nó có ý nghĩa hơn theo cách này bởi vì bạn có thể gán bất kỳ giá trị cũ cho foo.prototype
sau khi nó được xây dựng, phá vỡ foo
bằng cách biến nó thành một thể hiện của một lớp mà nó không được khởi tạo.
Nhà xây dựng Foo
tương tự sẽ không có ý nghĩa gì nếu nó hoạt động như một thể hiện của lớp mà nó định nghĩa; nó đã không được initalized bởi chính nó, vì vậy nó có thể không an toàn được giả định rằng nó sẽ thực hiện các hành vi dành cho trường hợp của mình. Foo
là một thể hiện của Function
, có ý nghĩa bởi vì nó có thể được gọi. Do đó, mẫu thử nghiệm củaFoo
là Function.prototype
, khôngFoo.prototype
.
Mối quan hệ giữa foo
và nguyên mẫu của thiết bị được thiết lập khi bạn gọi foo = new Foo
.Vì nội dung của hàm tạo Foo
được dự kiến khởi tạo phiên bản, đây là thời điểm chỉ để cung cấp foo
nguyên mẫu của nó hợp lý. Nguyên mẫu cung cấp một đối tượng các hành vi chung của nó, hàm tạo khởi tạo đối tượng để các hành vi này sẽ hoạt động như dự định. Nguyên mẫu được gán cho foo
khi nó được xây dựng qua new Foo
không có gì khác ngoài Foo.prototype
; điều này được thực hiện trước khiFoo
được thực thi để thuận tiện và đảm bảo rằng nó không thể bị sai lầm. Theo đó, không có cách nào để truy cập nguyên mẫu của foo
mà không qua Foo
một cách rõ ràng.
enter code here
Chỉ có hàm tạo hàm có thuộc tính '.prototype', được sử dụng khi bạn gọi chúng bằng' mới'. Tất cả các đối tượng đều có * prototype *, nhưng đây không phải là thuộc tính. – Bergi