Tôi đã nghiên cứu tương tự ... Trước hết, tất nhiên bạn không thể làm điều này + = x, 'this' là một đối tượng, bạn không thể sử dụng toán tử + trên đối tượng.
Có 'đằng sau những cảnh' phương pháp mà có được gọi là - ví dụ
String.prototype.example = function(){ alert(this); }
là thực sự gọi
String.prototype.example = function(){ alert(this.valueOf()); }
Vì vậy, những gì bạn cần phải tìm là một giá trị có liên quan mà không được điều ngược lại - một cái gì đó như this.setValue(). Ngoại trừ việc không có một. Điều tương tự cũng giữ cho Số.
Ngay cả việc xây dựng trong phương pháp đang bị ràng buộc bởi điều đó
var str = 'aaa';
str.replace(/a/, 'b');
console.log(str); // still 'aaa' - replace acts as static function
str = str.replace(/a/, 'b');
console.log(str); // 'bbb' - assign result of method back to the object
Trên một số đối tượng khác mà bạn có thể; ví dụ trên một ngày:
Date.prototype.example = function(){
this.setMonth(this.getMonth()+6);
};
var a=new Date();
alert(a.getMonth());
a.example();
alert(a.getMonth());
Đó là gây phiền nhiễu, nhưng có bạn đi
nguyên mẫu Không, tôi đang nghiên cứu và kiểm tra ra một số điều về thừa kế và đóng cửa trong JS. Thú vị thứ và tôi đã có một cảm giác mơ hồ rằng một String đã thực sự bất biến. Nó có vẻ hơi phi lý mà Array.pop thực sự có thể sửa đổi chính nó (hoặc băm nội bộ của các giá trị) nhưng String không thể sửa đổi chính nó. Chuỗi eing một trong năm nguyên thủy trong JS giải thích rất nhiều mặc dù! – ChrisR
Có vẻ khá không trực quan khi có một API mà biến sb1 không phải là một thể hiện của một StringBuilder sau 'var sb1 = new StringBuilder()'. Tại sao không gán {append: ...} cho StringBuilder.prototype và thay đổi 'var values = []' thành 'this.values = []'? Đây có phải là chỉ để tránh tiền tố giá trị trong append/toString với 'this.' hoặc là có cái gì đó tôi không xem xét ở đây? – ledneb