我如何在原型工作中获得 "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>
这就是所有标准字符串方法(toLowerCase
、replace
、substring
、...)的工作方式,通过返回 结果。
在线版本可能不是很清楚(并且很难调试),为了清楚起见,这里是拆分版本:
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>
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>
这就是所有标准字符串方法(toLowerCase
、replace
、substring
、...)的工作方式,通过返回 结果。
在线版本可能不是很清楚(并且很难调试),为了清楚起见,这里是拆分版本:
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>