2013-03-27 36 views
6

Tôi đang đọc cuốn sách Javascript: Phần tốt. Tôi là một chút nhầm lẫn khi tôi đọc mã bên dưới:Mối quan hệ giữa Số và Function.prototype trong javascript là gì?

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Number.method('integer',function(){ 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

Tôi nghĩ rằng phần đầu của đoạn code trên có nghĩa là bất kỳ chức năng trong JavaScript bây giờ có một phương pháp gọi là phương pháp . Nhưng "Số" cũng là một chức năng? Tại sao Number.method có ý nghĩa?

Tôi giả sử rằng Số đã kế thừa Number.prototype kế thừa Object.prototype (Number-> Number.prototype-> Object.prototype), vì Số không có phương thức "method" ở đầu, nó sẽ tìm kiếm nó dọc theo chuỗi nguyên mẫu. Nhưng Function.prototype không có trong chuỗi, phải không?

Mối quan hệ giữa số, Number.prototype và Function.prototype là gì?


CẬP NHẬT I:

tôi đã tìm kiếm một số thông tin thêm và bối rối hơn bây giờ. Một số người nói rằng Số thực ra là một hàm và điều này có vẻ hợp lý vì giá trị của Number instanceof Functiontrue. Nhưng giá trị của (-10/3) instanceof Numberfalse. Điều này có gây nhầm lẫn không? Nếu một số trong toán học (chẳng hạn như 3, 2.5, (-10/3)) thậm chí không phải là Number trong JavaScript, làm thế nào có thể (-10/3) gọi integer() là phương thức từ Number? (Dòng dưới đây xuất phát từ cùng một cuốn sách)

document.writeln((-10/3).integer()); 

CẬP NHẬT II:

Vấn đề được giải quyết, về cơ bản.

Nhờ @ giúp đỡ Xophmeister, hiện nay kết luận của tôi là Number có thể gọi methodNumber là một constructor để nó được liên kết với Function.prototype. Đối với lý do tại sao một số (3, 2.5, (-10/3)) có kiểu là kiểu nguyên thủy trong JavaScript có thể gọi một phương thức mà đối tượng Number có, ta nên tham khảo this page.

Tôi nhận được kết luận này về cơ bản từ trợ giúp của @ Xophmeister và một chút tìm kiếm để có thể không đủ chính xác. Bất kỳ sửa chữa hoặc hoàn thành được hoan nghênh.

+0

(-10/3) là một con số nhưng không phải là một số. – simon

+0

@simon Nhưng phương thức 'integer()' được định nghĩa trong 'Số', đúng không? Nếu (-10/3) không phải là một 'Số', tại sao nó có thể gọi' integer() '? – ChandlerQ

+0

'-10/3' không phải là đối tượng' Số' * *, nhưng có * loại * 'số'. Tôi nghĩ các phần 8.6.2 và 9.9 của thông số ECMA262 có liên quan đến điều này; đặc biệt là nội dung '[[PrimitiveValue]]' và 'ToObject' của JS. Bài đăng trên blog này có thể giải thích mọi thứ tốt hơn: http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/ – Xophmeister

Trả lời

3

tôi tin rằng các chuỗi nguyên mẫu là: Object>Function>Number:

Number instanceof Function; // true 
Number instanceof Object; // true 
Function instanceof Object; // true 
+0

'Ví dụ đối tượng của hàm' cũng trả về 'true', quá. –

+0

Điều này, tôi đoán, là bởi vì chức năng là công dân hạng nhất trong JavaScript. – Xophmeister

+0

Giống như những gì @ neustroev.ai nói, 'Object instanceof Function' là' true'. Điều đó có nghĩa là tất cả mọi thứ đối tượng trong JavaScript là một chức năng? – ChandlerQ

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