JSプロトタイプオブジェクト拡張

2266 ワード

以前はこのような問題を考えたことがあります.どのように原型の対象の方法を拡張すれば、方法は直接自身を変えることができます.新しい値を返すのではありません.
var str1 = "  Hello zhouzhou   ";
String.prototype.trimx = function(){
    return this.replace(/^\s* | \s*$/g , "");
}
var p = str1.trimx();  
console.log(p);       //             
console.log(str1);    //str1    
これはなぜですか?実は上のコードの原理は簡単です.あなたが呼んだのはreplace関数です.replace関数は新しい値を返します.
私の理解:
この問題を解決するには、Javascriptがどのように文字列を操作しているかを理解しなければならない.3段階に分けて:(既知のvar s=「ハローワールド」) s :
 1  var s = new String("value");
 2  //  String     ,     , s  String     
 3  s = NULL ; //     ,  s      
メモリ構造から上のプログラムを分析します.
//       ,   str1    ,"  Hello zhouzhou  "          ,      
var str1 = "  Hello zhouzhou  "   
// String        trimx  ,   String          。
String.prototype.trimx = function(){
    return this.replace(/^\s* | \s*$/g , "");
}
//      :  str1.trimx()  ,        ?
          ,    :
A.    :   str1     ,               String  ,String      
       "  Hello zhouzhou  "      ,             。
B.    :  String trimx  ,       ,  "Hello zhouzhou" ,           
           ,             ,             ,        
          。
C.    : str1 = NULL ,   string        ,str1     "  Hello zhouzhou  "
var p = str1.trimx();  
console.log(p);       //             
console.log(str1);    //str1    
これはあなたに教えて、直接に自分を変えてはいけません.でも、後ろにstr 1=str 1.trimx(「xxxxx」)を書いてもいいです.
以下で検証します.
function Stringx(str){
    this.str = str;
}
var b = new Stringx("hello,world");
Stringx.prototype.say = function(){
    console.log("say");
}
console.log(b);       //b  String              
var x = new String("nihao");
var t = "   nihao    ";
console.log(t);     //          
var d = t.trim(); //      trim         ,            
console.log(d);
//x.toString(),x.valueOf(),               ,             
x.value    。
console.log(x.toString()); 
String.prototype.trimx = function(){
     console.log(1);
    return this.replace(/^\s*|\s*$/g,"");
} 
console.log(String.prototype);  //String     
//t String   ,t             ,           ,          
   。
console.log(t.__proto__.trim);  
メモリも描けます.