JSプロトタイプオブジェクト拡張
2266 ワード
以前はこのような問題を考えたことがあります.どのように原型の対象の方法を拡張すれば、方法は直接自身を変えることができます.新しい値を返すのではありません.
私の理解:
この問題を解決するには、Javascriptがどのように文字列を操作しているかを理解しなければならない.3段階に分けて:(既知のvar s=「ハローワールド」)
以下で検証します.
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);
メモリも描けます.