2010-07-14 39 views
5

Có thể câu hỏi này rất dễ, nhưng bây giờ tôi không thể hiểu được.Thừa kế của javascript

String.prototype.self=function() 
{ 
    return this; 
} 
var s="s"; 

alert("s".self()=="s".self()) //false; 
alert(s.self()==s.self()) //false; 

Nếu bạn biết lý do, vui lòng cho tôi biết tại sao kết quả là "sai".

Trả lời

8

Đó là vì khi thuộc tính được truy cập từ giá trị nguyên thủy, chẳng hạn như "s", property accesors ép buộc nội bộ ToObject và so sánh không thành công vì nó kiểm tra hai tham chiếu đối tượng khác nhau.

Ví dụ:

String.prototype.test = function() { 
    return typeof this; 
} 

"s".test(); // "object" 

Nó giống như so sánh:

new String("s") == new String("s"); // false 
+0

Tại sao ví dụ thứ hai thất bại? –

+2

@Graphain trong biểu thức 's.self() == s.self()', giá trị chứa trong biến 's' bị ép buộc hai lần' ToObject', vì 's' giữ nguyên thủy, khi dấu chấm ('.') accessor thuộc tính được sử dụng, được ép buộc đối tượng để có thể truy cập các thành viên' String.prototype'. So sánh sẽ tương đương với 'var s = 's'; new String (s) == new String (s); 'cũng tạo ra' false'. – CMS

+1

@Graphain trong các thuật ngữ layman, mặc dù cả hai đối tượng chuỗi chứa cùng một dữ liệu, chúng là các đối tượng khác nhau, và do đó == false. – Stephen