2009-10-23 26 views
8

Theo như tôi biết nó không thể thay đổi một đối tượng từ bản thân theo cách này:Chuỗi nguyên mẫu sửa đổi bản thân

String.prototype.append = function(val){ 
    this = this + val; 
} 

Vậy là nó không thể thực hiện ở tất cả để cho một hàm chuỗi sửa đổi bản thân?

Trả lời

16

String nguyên thủy là không thay đổi, chúng không thể thay đổi sau khi chúng được tạo.

Điều đó có nghĩa là các ký tự bên trong chúng có thể không bị thay đổi và bất kỳ thao tác nào trên chuỗi thực sự tạo chuỗi mới.

Có lẽ bạn muốn triển khai loại trình tạo chuỗi?

function StringBuilder() { 
    var values = []; 

    return { 
    append: function (value) { 
     values.push(value); 
    }, 
    toString: function() { 
     return values.join(''); 
    } 
    }; 
} 

var sb1 = new StringBuilder(); 

sb1.append('foo'); 
sb1.append('bar'); 
console.log(sb1.toString()); // foobar 
+0

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

+0

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

-1

Chuỗi không thay đổi; những gì bạn đang hỏi giống như nói, "Tại sao tôi không thể làm:

Number.prototype.accumulate = function (x) { 
    this = this + x; 
}; 

...?"

3

Trong khi chuỗi là không thay đổi, cố gắng gán bất cứ điều gì để this trong lớp bất kỳ sẽ ném một lỗi.

0

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

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