2010-11-10 31 views
5

Mặc dù tôi đã đọc rất nhiều về nó nhưng tôi không thể có được đầu của tôi xung quanh khái niệm nguyên mẫu.Nguyên mẫu trong Javascript

Tại sao có StringString.prototype?

Nếu tôi có "cat":

  • Là một String hoặc một Object?
  • Nó có kế thừa tất cả các thuộc tính/phương pháp từ String hoặc String.prototype không?
  • Tại sao có StringString.prototype?
  • Tôi có nên gọi chuỗi đối tượng StringString.prototype nguyên mẫu Chuỗi không?

Hãy mang đến sự rõ ràng cho điều này.

Trả lời

10

tôi trả lời này bởi vì có rất nhiều thông tin sai lạc trong chủ đề:

Là một String hoặc một đối tượng?

Không"cat" là một nguyên thủy String value:

typeof "cat"; // "string", a String value 
"cat" instanceof String; // false 


typeof new String("cat"); // "object", a String object 
new String("cat") instanceof String; // true 

tôi sẽ nói sau này về chủng loại và giá trị nguyên thủy.

Nó có kế thừa tất cả các thuộc tính/phương thức từ String hoặc String.prototype không?

Vâng, khi bạn sử dụng property accessor operator (dấu chấm hoặc ký hiệu khung), giá trị nguyên thủy được ngầm chuyển đổi sang đối tượng, trong nội bộ, do đó tất cả các phương pháp trên String.prototype có sẵn, ví dụ:

Khi bạn truy cập vào:

"cat".chatAt(0); 

Đằng sau những cảnh "cat" được chuyển thành đối tượng:

Object("cat").chatAt(0); 

Đó là lý do tại sao bạn có quyền truy cập vào tất cả các thuộc tính được kế thừa trên các giá trị.

Tại sao có chuỗi và String.prototype?

String là một hàm constructor, cho phép bạn tạo Chuỗi đối tượng hoặc làm loại chuyển đổi:

var stringObj = new String("foo"); // String object 

// Type conversion 
var myObj = { toString: function() { return "foo!"; } }; 

alert(String(myObj)); // "foo!" 

Các String.prototype đối tượng, là đối tượng mà Chuỗi trường hợp đối tượng kế thừa từ.

Tôi biết nó khó hiểu, chúng ta có các giá trị String và các đối tượng String, nhưng hầu hết thời gian bạn thực sự chỉ làm việc với các giá trị chuỗi, đừng lo lắng về các đối tượng String.

Tôi có nên gọi String đối tượng String và String.prototype mẫu String không?

Bạn nên gọi String"The String constructor".

"Chuỗi nguyên mẫu" là ok.

Bạn nên biết rằng "Mọi thứ đều là KHÔNG một đối tượng".

Hãy nói về loại, có năm language types quy định:

  • Chuỗi
  • Số
  • Boolean
  • Null
  • Undefined

A primitive value là "một mốc được trình bày trực tiếp ở mức thấp nhất của việc thực hiện ngôn ngữ", phần thông tin đơn giản nhất mà bạn có thể có.

Các giá trị của các loại được mô tả trước đây có thể là:

  • Null: Giá trị null.
  • Không xác định: Giá trị undefined.
  • Số: Tất cả các số, chẳng hạn như 0, 3.1416, 1000, v.v. Ngoài ra NaNInfinity.
  • Boolean: Các giá trị truefalse.
  • Chuỗi: Mỗi chuỗi, chẳng hạn như "cat""bar".
+0

Tôi đồng ý với bạn về sự khác biệt "chuỗi" và String() mới, tôi thừa nhận rằng tôi không biết điều đó. Nhưng tôi không đồng ý với một phần của datum và các đối tượng.Có thể các chuỗi, các boolean và các số không phải là các đối tượng nhưng chúng được biểu diễn như các đối tượng trong JS và nếu bạn làm một cái gì đó như String instanceof Object thì kết quả là đúng. – mck89

+0

@ mck89, tôi có nghĩa là giá trị nguyên thủy là phần dữ liệu đơn giản nhất mà bạn có, có, bạn có thể "coi chúng là đối tượng", (ví dụ: truy cập thuộc tính kế thừa, '" foo ".chatAt' hoặc' 5 .. toFixed'), nhưng chúng vẫn chỉ là giá trị, chứ không phải đối tượng. Về 'String instanceof Object' là hiển nhiên bởi vì' String' là * một đối tượng hàm *, kế thừa từ 'Function.prototype', kế thừa từ' Object.prototype', do đó, 'String instanceof Function' sẽ cung cấp cho bạn' true '. – CMS

3

Chuỗi là Đối tượng trong JavaScript. Không có kiểu dữ liệu thực được gọi là chuỗi như trong PHP, C hoặc các ngôn ngữ khác.

String.prototype ist một cấu trúc để thêm chức năng cho tất cả các đối tượng chuỗi của bạn. Nếu bạn muốn tất cả Strings để cung cấp ví dụ như một chức năng chuyển đổi bạn làm như sau:

String.prototype.convert = function() { 
    // Put your code in here 
} 

// Set up y new String 
var example = "cat"; 

// Now you can call your function 
example.convert(); 
+1

Điều đó không đúng, JavaScript có loại Chuỗi, '" mèo "' là [** giá trị nguyên thủy **] (http://bclary.com/2004/11/07/#a-4.3. 2). JavaScript cũng có thể có * Đối tượng chuỗi * nhưng khái niệm khác nhau, chúng chỉ đơn giản là bọc các nguyên thủy, ví dụ: 'alert (typeof" foo "); // "string" ',' alert (typeof Object ("cat")) // "đối tượng" '. Kiểm tra [câu trả lời của tôi] (http://stackoverflow.com/questions/4142230/prototypes-in-javascript/4142624#4142624). – CMS

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