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

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',明白我的意思?

所有的解决方法和学费都欢迎窥视,我只是问你知道你在说什么.谢谢

T.J*_*der 7

写一个类似的属性为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)