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 Function
là true
. Nhưng giá trị của (-10/3) instanceof Number
là false
. Đ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 method
vì Number
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.
(-10/3) là một con số nhưng không phải là một số. – simon
@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
'-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