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

how do i get "this = this" in prototype working

Ok peep's so I know it's bad practice to mess with prototypes but here it is anyway...


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 是 'immutable' 或者当他们表示它是静态且不可更改的时候它是什么?


进入正题!我的问题是...

str = 'abc'

我希望能够说 str.rev() 而不是 str = str.rev() 并得到 str = 'cba' 的结果 str === 'cba',明白我的意思了吗?!

所有变通办法和学费欢迎窥视,我只是问你知道你在说什么。谢谢

My problem comes when writing a similar property for 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('');
    };

然后:

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>

这就是所有标准字符串方法(toLowerCasereplacesubstring、...)的工作方式,通过返回 结果。


在线版本可能不是很清楚(并且很难调试),为了清楚起见,这里是拆分版本:

String.prototype.rev=
    function(){
        var characters = this.split('');
        characters.reverse();
        return characters.join('');
    };

(请注意,Array#reverse 反转数组 returns 数组引用;事实上它也是 returns 数组引用是使多合一版本成为可能的原因。)


旁注:如果您要尝试使用原型,请考虑使用 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>