好的peep's所以我知道弄乱原型是不好的做法,但无论如何它都是......
Array.prototype.rev=
function(){
this.reverse();
}
工作正常!按预期更新源数组变量ary
,例如:
ary = [123, 456];
ary.rev();
// result: ary == [456, 123]
为String
编写类似的属性时出现了问题。
我想做的是这样......
String.prototype.rev=
function(){
this.split('');
this.reverse();
this.join('');
}
看起来很简单吧!拆分字符串,将其反转,并将其重新连接在一起,这样原始字符串变量str
就会与之前的自身相反,就像上面的ary
一样!
事情是:虽然已调用this.split()
,但它需要存储为变量,即:
split = this.split('');
这就是this = this
问题......
现在定义了split
,它将重点放在编辑源变量上,并且它不像我在函数末尾所说的那样:
this = split;
因为this
是'不可变的',或者当它们意味着它是静态的且不可改变时它是什么?
str = 'abc'
我希望能够说str.rev()
而不是str = str.rev()
并获得str = 'cba'
str === 'cba'
的结果,抓住我的漂移?!
所有的解决方法和学费欢迎窥视,我只是问你知道你在说什么。 THX
答案 0 :(得分:7)
我为
写一个类似的属性时遇到了问题String
...
这里的主要问题是JavaScript中的字符串是不可变的;你不能改变一个字符串。因此,定义一个行为如此的rev
方法是不可能的:
var a = 'abc';
a.rev(); // <== This can't work this way
console.log(a); // cba
相反,您的rev
应该执行所有其他String
方法所做的事情:返回包含更新的新字符串。
第二个问题是,rev
方法中的代码无法正常工作,因为您并未将this.split('');
之类的内容保存在任何位置,而是split
的方式rev
1}}工作,返回带有条目的数组。
这是String.prototype.rev=
function(){
return this.split('').reverse().join('');
};
的一个版本,可以解决这两个问题:
var a = 'abc'.rev();
console.log(a); // cba
然后:
String.prototype.rev = function(){
return this.split('').reverse().join('');
};
var a = 'abc'.rev();
snippet.log(a);
示例:
<!-- 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>
&#13;
toLowerCase
&#13;
这是所有标准字符串方法(replace
,substring
,String.prototype.rev=
function(){
var characters = this.split('');
characters.reverse();
return characters.join('');
};
,...)的工作方式,返回结果。< / p>
全对一版本可能不太清晰(并且难以调试),为清晰起见,这里是拆分版本:
Array#reverse
(注意Object.defineProperty
将数组反转到并且返回数组引用;它还返回数组引用的事实是使得一体化版本成为可能的原因。)
旁注:如果你打算使用原型,请考虑使用Object.defineProperty(String.prototype, "rev", {
value: function() { ... }
});
而不是仅仅分配:
for-in
...以便新属性不可枚举(不会显示在String
循环中)。使用for-in
并不重要,但很多人仍错误地使用Object.defineProperty(String.prototype, "rev", {
value: function(){
return this.split('').reverse().join('');
}
});
var a = 'abc'.rev();
snippet.log(a);
来循环遍历数组,所以......
示例:
<!-- 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>
&#13;
{{1}}&#13;