当我为以下对象编写类似的属性时,我的问题就出现了String
...
这里的主要问题是字符串是不可变的在 JavaScript 中;您无法就地更改字符串。因此,不可能定义一个rev
行为如下的方法:
var a = 'abc';
a.rev(); // <== This can't work this way
console.log(a); // cba
相反,你的rev
应该做所有其他事情String
方法做:Return包含更新的新字符串。
第二个问题是你的代码rev
方法不起作用,因为你没有保存类似的结果this.split('');
任何地方,但方式split
有效,它returns包含条目的数组。
这是一个版本rev
解决了这两个问题:
String.prototype.rev=
function(){
return this.split('').reverse().join('');
};
Then:
var a = 'abc'.rev();
console.log(a); // cba
Example:
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>
这就是所有标准字符串方法(toLowerCase
, replace
, substring
, ...) 工作,通过返回结果。
全在线版本可能不是非常清晰(并且很难调试),为了清楚起见,这里是拆分版本:
String.prototype.rev=
function(){
var characters = this.split('');
characters.reverse();
return characters.join('');
};
(注意Array#reverse
就地反转数组and返回数组引用;事实上它还返回数组引用,这使得一体化版本成为可能。)
旁注:如果您要尝试原型,请考虑使用Object.defineProperty
而不仅仅是分配:
Object.defineProperty(String.prototype, "rev", {
value: function() { ... }
});
...这样新属性是不可枚举的(不会出现在for-in
循环)。没有那么重要String
,但是很多人still错误使用for-in
用于循环数组,所以...
Example:
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>