Hôm nay tôi tình cờ có quá nhiều thời gian để giết và tôi đã chơi một chút với dòng lệnh Node (v0.10.13):Tại sao JavaScript nguyên thủy không phải là đối tượng của đối tượng?
> 1 instanceof Object
false
> (1).__proto__
{}
> (1).__proto__ instanceof Object
true
> (1).__proto__.__proto__ === Object.prototype
true
Bây giờ, theo MDN, những gì instanceof
làm là:
Toán tử instanceof kiểm tra xem một đối tượng có trong chuỗi nguyên mẫu nguyên mẫu của một hàm tạo hay không.
Nhưng rõ ràng là Object.prototype
IS trong chuỗi nguyên mẫu của 1
. Vậy tại sao 1 instanceof Object
là sai? Có lẽ vì 1
là một nguyên thủy không phải là một đối tượng để bắt đầu?
Được rồi, tôi chấp nhận điều đó, và tôi đã làm thêm các xét nghiệm:
> (1).__proto__ === (2).__proto__
true
> 'a'.__proto__ === 'b'.__proto__
true
> (1).__proto__ === 'a'.__proto__
false
> (1).__proto__.__proto__ === 'a'.__proto__.__proto__
true
> (1).__proto__.type = 'number'
'number'
> 'a'.__proto__.type = 'string'
'string'
> (2).type
'number'
> (1.5).type
'number'
> 'b'.type
'string'
Vì vậy, dường như tất cả nguyên thủy số kế thừa từ một đối tượng, và tất cả các chuỗi nguyên thủy kế thừa từ một đối tượng khác. Cả hai đối tượng này đều được kế thừa từ Object.prototype
.
Bây giờ câu hỏi đặt ra là, nếu số và chuỗi được coi là nguyên thủy, tại sao kế thừa chúng từ các đối tượng khác? Hoặc ngược lại, khi chúng kế thừa từ các đối tượng khác, tại sao không xem xét chúng đối tượng? Dường như vô nghĩa đối với tôi rằng đứa trẻ của một vật thể không phải là một vật thể ..
Nhân tiện, tôi cũng đã thử nghiệm chúng trong Firefox 22 và có cùng kết quả.
Great câu trả lời, cảm ơn. –
Tất cả +1 của tôi đều đến với bạn! – Greg
Myne 2 .... :-). –