Los*_*ace 1 javascript reverse prototype this
好的peep's所以我知道弄乱原型是不好的做法,但无论如何......
Array.prototype.rev=
function(){
this.reverse();
}
Run Code Online (Sandbox Code Playgroud)
工作良好!更新源数组变量ary,如预期的那样:
ary = [123, 456];
ary.rev();
// result: ary == [456, 123]
Run Code Online (Sandbox Code Playgroud)
写一个类似的属性我的问题来了String.
我想做的是这样的......
String.prototype.rev=
function(){
this.split('');
this.reverse();
this.join('');
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单吧!拆分字符串,反转它,然后将它连接在一起,这样原来的字符串变量str就像它以前的自身一样,就像ary上面那样!
事情是:虽然this.split()已被调用,但它需要存储为变量,即:
split = this.split('');
Run Code Online (Sandbox Code Playgroud)
这就是this = this问题所在......
现在split已定义,它将重点放在编辑源变量上,并且它不像我在函数末尾所说的那样:
this = split;
Run Code Online (Sandbox Code Playgroud)
那this是"不可改变的",或者当它们意味着它是静态的和不可改变的时候是什么?
str = 'abc'
Run Code Online (Sandbox Code Playgroud)
我想可以说str.rev()没有str = str.rev(),并得到的结果str = 'cba',其中str === 'cba',明白我的意思?
所有的解决方法和学费都欢迎窥视,我只是问你知道你在说什么.谢谢
写一个类似的属性为
String...时出现问题
这里的主要问题是字符串在JavaScript中是不可变的; 你不能改变一个字符串.因此,定义一个rev行为如下的方法是不可能的:
var a = 'abc';
a.rev(); // <== This can't work this way
console.log(a); // cba
Run Code Online (Sandbox Code Playgroud)
相反,您rev应该执行所有其他String方法的操作:返回包含更新的新字符串.
第二个问题是你的rev方法中的代码不起作用,因为你没有保存this.split('');任何地方的结果,但是方式split有效,它会返回一个带有条目的数组.
这是一个rev解决这两个问题的版本:
String.prototype.rev=
function(){
return this.split('').reverse().join('');
};
Run Code Online (Sandbox Code Playgroud)
然后:
var a = 'abc'.rev();
console.log(a); // cba
Run Code Online (Sandbox Code Playgroud)
例:
String.prototype.rev = function(){
return this.split('').reverse().join('');
};
var a = 'abc'.rev();
snippet.log(a);Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>Run Code Online (Sandbox Code Playgroud)
这是怎么回事标准字符串的方法(的toLowerCase,replace,substring,...)工作,通过返回的结果.
全对一版本可能不太清晰(并且难以调试),为清晰起见,这里是拆分版本:
String.prototype.rev=
function(){
var characters = this.split('');
characters.reverse();
return characters.join('');
};
Run Code Online (Sandbox Code Playgroud)
(注意,Array#reverse反转数组并返回数组引用;它还返回数组引用的事实是使得一体化版本成为可能的原因.)
旁注:如果您打算使用原型,请考虑使用Object.defineProperty而不仅仅是分配:
Object.defineProperty(String.prototype, "rev", {
value: function() { ... }
});
Run Code Online (Sandbox Code Playgroud)
...以便新属性不可枚举(不会显示在for-in循环中).与此无关String,但很多人仍然错误地使用for-in循环数组,所以......
例:
Object.defineProperty(String.prototype, "rev", {
value: function(){
return this.split('').reverse().join('');
}
});
var a = 'abc'.rev();
snippet.log(a);Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |