如何在原型工作中得到“this = this”

时间:2015-01-26 10:17:29

标签: javascript prototype this reverse

  

好的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

1 个答案:

答案 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);

示例:

&#13;
&#13;
<!-- 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;
&#13;
&#13;

这是所有标准字符串方法(replacesubstringString.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);来循环遍历数组,所以......

示例:

&#13;
&#13;
<!-- 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;
&#13;
&#13;