2010-11-01 75 views
6

Tôi biết rằng thuộc tính prototype của đối tượng hàm JavaScript được sao chép vào thuộc tính nội bộ [[Prototype]] (a.k.a. __proto__) của các đối tượng được khởi tạo bằng cách sử dụng hàm làm hàm tạo. Vì vậy, tôi có thể thiết lập thuộc tính này cho bất kỳ đối tượng mà tôi muốn đóng vai trò như nguyên mẫu:Giá trị ban đầu của thuộc tính nguyên mẫu của hàm JavaScript là gì?

function Foo() {} 
Foo.prototype = { 
    toString: function() { return "I'm a Foo!"; } 
} 
new Foo().toString() 
// --> "I'm a Foo!" 

Dường như đó là thực hành rộng rãi để thêm chức năng mà nên đóng vai trò là phương pháp lớp học để các nguyên mẫu của mới hiện chức năng được tạo ra như thế này:

function Bar() {} 
Bar.prototype.toString = function() { 
    return "I'm a Bar!"; 
} 
new Bar().toString() 
// --> "I'm a Bar!" 

Không rõ với tôi, tuy nhiên, những gì mà giá trị ban đầu của prototype tài sản là.

function Baz() {} 
Baz.prototype 
// --> Baz { 
//  constructor: function Baz() {}, 
//  __proto__: Object 
//  } 

Nhận xét hiển thị bảng điều khiển JavaScript của Chrome sẽ in. Điều này có nghĩa là mọi chức năng tôi tạo thực sự tạo ra hai đối tượng? Một cho bản thân chức năng (constructor) và một cho nguyên mẫu của nó?

Điều này có được định nghĩa ở đâu đó trong tiêu chuẩn ECMAScript không? Tôi cố gắng tìm nhưng không thể. Tất cả các trình duyệt có xử lý điều này theo cùng một cách không?

Trả lời

10

Giá trị ban đầu của prototype trên bất kỳ mới tạo Function dụ là một trường hợp mới của Object, nhưng với những thiết lập riêng-tài sản constructor chỉ trở lại chức năng mới.

này được mô tả trong điển hình thời trang hoàn toàn-không đọc được ECMAScript-Spec bởi ECMA262-5 trong phần 13,2:

(16.) Hãy proto thể là kết quả của việc tạo ra một đối tượng mới như sẽ được xây dựng bởi biểu thức new Object() nơi Object là tiêu chuẩn được xây dựng trong constructor với tên đó

(17.) Gọi [[DefineOwnProperty]] phương pháp nội bộ của proto với đối số "nhà xây dựng", tài sản Descriptor {[[Giá trị]]: F, {[[Ghi được]]: đúng, [[Có thể đếm được]]: sai, [[Có thể cấu hình]]: đúng} và sai.

(18.) Gọi phương thức bên trong [[DefineOwnProperty]] của F với đối số "nguyên mẫu", Mô tả thuộc tính {[[Value]]: proto, {[[Ghi được]]: true, [[Enumerable]] : false, [[Configurable]]: false} và false.

+0

Cảm ơn. Đó chính là câu trả lời tôi đang tìm kiếm. – MForster

+1

OMG! Tôi đi sâu vào đặc điểm kỹ thuật ECMAScript mọi lúc và sau đó, nhưng điều này hầu như không thể đọc được. Bạn có biết một nguồn tài nguyên giải thích mọi thứ trong đó từng bước (hoặc ít nhất là giải thích những phần khủng khiếp)? –

+2

Đáng buồn là không. Đó là một sự xấu hổ không có tài liệu tham khảo tốt cho ECMAScript như một ngôn ngữ trong tiếng Anh thực tế, đặc biệt là vì rất nhiều tính năng của nó là ... để được hào phóng ... một chút kỳ quặc. Chúng tôi có các hướng dẫn dành riêng cho nhà cung cấp như MDC, MSDN và Adobe, chúng tôi có thông số kỹ thuật ECMA không thể sử dụng được nhiều (bạn đã quen với ngôn ngữ trên), nhưng nó vẫn thực sự nặng vào thời điểm tốt nhất), và ngoài ra có máng xối của các trang web hướng dẫn ngẫu nhiên có đầy đủ các lỗi và lời khuyên khủng khiếp. Và điều này, đối với một trong những ngôn ngữ được sử dụng rộng rãi nhất trên thế giới. Nó là vô vọng. – bobince

Các vấn đề liên quan