Tôi nghĩ, tôi quá ẩn dụ và khó hiểu với câu trả lời trước. Làm rõ sau đây.
Một thể hiện của Array, Boolean, Date, Function, Number, RegExp, String là một Object nhưng được tăng cường với các phương thức và thuộc tính cụ thể cho từng loại. Ví dụ: một mảng có thuộc tính được xác định trước length
trong khi các đối tượng chung thì không.
javascript:alert([].length+'\n'+{}.length)
màn hình
0
chưa xác định
Về cơ bản, trình thông dịch FF Gecko cũng phân biệt giữa Mảng và Đối tượng chung với sự khác biệt rõ ràng đánh giá cấu trúc ngôn ngữ.
javascript:
ra=[ "one", "two", "three"]; ra.a=4;
ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
alert(
ra +"\n\n"+
ob +"\n\n"+
ra.toSource() +"\n\n"+
ra.a +"\t .toSource() forgot me! \n\n"+
ra.length +"\t and my length! \n\n"+
ob.toSource());
ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */
ps=""; for(i in ob)ps+=i+" "; alert(ps);
trưng bày
một hai ba
[đối tượng Đối tượng]
["một hai ba"]
4 .toSource () quên tôi!
3 và chiều dài của tôi!
({0: "một", 1: "hai", 2: "ba", a: 4})
và 0 1 2 a
và0 1 2 a
.
Về tuyên bố rằng tất cả các đối tượng là các hàm:
Nó không phải là cú pháp hay ngữ nghĩa chính xác để sử dụng một trường hợp đối tượng tùy ý như là một chức năng như 123()
hoặc "abc"()
hoặc []()
hoặc {}()
hoặc obj()
nơi obj
là bất kỳ loại nào khác hơn Function
, vì vậy một đối tượng INSTANCE tùy ý không phải là một Function
. Tuy nhiên, với một đối tượng obj
và nó thuộc loại như Array, Boolean, Date, ...
thế nào, làm thế nào obj
để trở thành một đối tượng Array, Boolean, Date, ...
? An là Array, Boolean, Date, ...
gì?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
màn hình
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
Trong mọi trường hợp, không có ký hiệu tương đương, kiểu đối tượng biểu hiện dưới dạng function
định nghĩa, do đó phát biểu rằng tất cả các đối tượng đều là hàm! (Điều khó hiểu là tôi đã cố tình che khuất và làm mờ sự phân biệt của một đối tượng đối tượng với đối tượng cùng loại! Tuy nhiên, điều này cho thấy "bạn không thể có cái này mà không có cái kia", Đối tượng và Hàm! Viết hoa nhấn mạnh kiểu là trái ngược với ví dụ.)
Cả mô hình chức năng và đối tượng dường như là nền tảng cho việc lập trình và triển khai các nguyên thủy tích hợp sẵn của trình thông dịch JS cấp thấp, chẳng hạn như Math
và JSON
và true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
màn hình
[object Math]
[object JSON]
(new Boolean(true))
Vào thời điểm phát triển của Javascript, một phong cách lập trình lấy đối tượng làm trung tâm (OOP's - Object Oriented Programming style - "'s" là cách chơi chữ của riêng tôi!) Đã thịnh hành và trình thông dịch cũng được đặt tên tương tự với Java để mang lại độ tin cậy cao hơn cho nó. . Các kỹ thuật lập trình chức năng đã được xếp hạng cho các kỳ thi trừu tượng hơn và bí truyền hơn nghiên cứu các lý thuyết về Automata, Hàm đệ quy, Ngôn ngữ chính thức, v.v. và những thứ đó không dễ hiểu. Tuy nhiên, điểm mạnh của những cân nhắc chính thức này được thể hiện rõ ràng trong Javascript, đặc biệt khi được triển khai trong engine Gecko của FF (ví dụ .toSource()
:).
Định nghĩa Đối tượng cho Hàm đặc biệt thỏa mãn vì nó được định nghĩa như một quan hệ lặp lại! được định nghĩa bằng cách sử dụng định nghĩa riêng của nó!
function Function() { [native code] }
và vì một chức năng là một Đối tượng nên tình cảm giống nhau
function Object() { [native code] }
.
Hầu hết các định nghĩa khác đều tuân theo giá trị đầu cuối tĩnh. Tuy nhiên, eval()
là một nguyên thủy đặc biệt mạnh mẽ và vì vậy một Chuỗi cũng có thể nhúng chức năng tùy ý.
Lưu ý một lần nữa, ngôn ngữ bản ngữ được sử dụng ở trên che khuất sự phân biệt kiểu đối tượng và đối tượng.