2012-10-03 8 views
5

Tôi biết điều này là cau mày, tôi chỉ khám phá ý tưởng và cho cuộc sống của tôi dường như không thể làm cho công việc này theo cách tôi cũng muốn nó.Chỉ cần tò mò làm thế nào để phân lớp đối tượng String. (nguyên mẫu)

Ví dụ nên giải thích tất cả:

String.prototype.MyNS = function() {} 
String.prototype.MyNS.fooify = function() { 
    return this + 'foo!'; 
} 

var theString = 'Kung'; 

alert(theString.MyNS.fooify()); 

Tất nhiên điều này chỉ đơn giản là thêm định nghĩa chức năng để 'foo' ... thêm này() làm việc thay vì doesnt.

Tôi hiểu rằng tôi đã mất ngữ cảnh trong đó nhưng không thể tìm ra cách làm cho bản gốc tắt và cho tôi những gì tôi muốn.

+0

liên quan: http://stackoverflow.com/questions/7141734/extending-core-types-without-modifying-prototype? – valentinas

Trả lời

7

Dưới đây là một cách để bạn có thể làm điều đó:

String.prototype.MyNS = function() { 
    var _this = this; 
    return { 
     fooify: function() { 
      return _this + 'foo!'; 
     } 
    }; 
} 

Xem nó in action on jsFiddle

Note, như slashingweapon chỉ ra, rằng bạn sẽ phải gọi nó như vậy:

String.prototype.MyNS().fooify(); 

Theo như tôi biết, không có cách nào để duyệt qua trình duyệt mà không cần phải gọi MyNS làm chức năng.

+1

Nhưng bạn phải gọi nó là "bất cứ điều gì" .MyNS(). Fooify(); ' – slashingweapon

+0

Tôi thích nó! Tôi ước tôi không phải gọi nó như thế nhưng ít nhất nó cũng hoạt động ... cảm ơn! –

+0

Điều gì là chính xác: 'String.prototype.MyNS(). Fooify()' HOẶC 'String.MyNS(). Fooify()'? Câu trả lời đề cập đến nhận xét của @slashingweapon, nhưng sau đó đề cập đến một cú pháp khác. – jahroy

1

Bạn đang thêm function (class in oo mới) vào Stringprototype và không có quyền truy cập vào phiên bản String thực tế.

Bạn chỉ có thể thêm tài sản trực tiếp đến nguyên mẫu:

String.prototype.fooify = function() { 
    return this + 'foo!'; 
} 
var theString = 'Kung'; 
alert(theString.fooify());