[英]Why can't I assign a new value to “this” in a prototype function?
我为什么可以这样做:
Array.prototype.foo = function() {
this.splice(0, this.length);
return this.concat([1,2,3]);
}
但是我不能这样做:
Array.prototype.foo = function() {
return this = [1,2,3];
}
这两个函数都破坏了this的值并将其更改为[1,2,3]
但是第二个函数抛出以下错误: Uncaught ReferenceError: Invalid left-hand side in assignment
我怀疑这是因为允许分配意味着我可以将数组更改为其他内容(例如字符串),但是我希望那里的人可以肯定并且/或者有更详细的解释。
您正在将对象与引用混淆。
数组是一个对象,当您使用[1,2,3]
类的文字时,您正在创建一个新数组。
像this
的变量名或a
是对对象的引用。 如果有帮助,可以将一个对象想象为一个人,将引用想象为其昵称。 您可以对同一对象有多个引用,例如:
var a = [1,2];
var b = a;
b.push(3);
alert(a.length); // Gives "3"
想象一下,如果您有一个名为Sarah的朋友。 您有时也称她为“ Ace”。 如果Sarah有一天理发,那么Ace也会理发,因为“ Sarah”和“ Ace”是同一个人的不同名字。
如果您使用诸如a.push
或a.splice
类的变异数组方法(但是concat
不是一个!),则更改现有的Array对象,并且a
仍然引用相同的对象。 这就像剪头发-您看起来可能有所不同,但您仍然是同一个人。
当使用a = [1,2,3]
分配对新值的引用时,您将创建一个新数组,并更改a
来引用它。 这就像找到一个有着不同头发的新朋友,然后决定给她打A牌一样。
现在, this
是由Javascript生成的特殊名称。 它不是像Sarah这样的名字,而是更多的标题,例如“ mother”。 您的妈妈可以换个新发型,但是您不能换个新妈妈。 同样,您不能从函数内部更改this
引用。
不允许在函数中this
赋值。 假设您可以执行此操作,并且您的代码如下所示:
Array.prototype.foo = function() {
return this = [1, 2, 3];
}
var a = ["beans", "rice"];
a.foo();
// a now points to an object containing [1, 2, 3]
现在,如果您这样做:
var a = ["beans", "rice"];
var b = a; // b refers to the same object as a
b.foo();
// what does b refer to now? how about a?
在对象上调用函数.foo()
的行为不应更改对象的身份 。 这将是主叫方很混乱,如果b
突然开始指的是不同的对象不是a
仅仅是因为一些方法被调用。
您无权重新分配this
权限。 因为与执行上下文关联的this值是不可变的。
是否有可能改变的值this
? 如果没有分配,则不能this
分配值
您的情况:
Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]); }
但是我不能这样做:
Array.prototype.foo = function() { return this = [1,2,3]; }
当您修改原型添加方法foo()
,第一部分使数组变为空,等于重新分配其实例。
例如以var a = []
然后在返回值中:
return this.concat([1,2,3]);
请记住, concat
不会破坏数组,它会创建一个新数组并返回它
给定a = ['x']
和b = ['y']
, c = a.concat(b)
导致c = ['x','y']
,并且a
和b
保持不变
现在,既然您在数组中执行此操作
a=['a','b','c']
然后调用a.foo();
,其中a
内a
this.splice(0, this.length);
等于a=[]
this.splice(0, this.length);
然后将[ ]
与[1,2,3]
因此,如果我只说a.foo()
,实际上,如果我不将结果分配给某些东西,外面什么都不会发生,只是一个保持空。
如果将a
分配给某物
c = a.foo()
然后c
将[1,2,3]
和a
仍然是空的[ ]
在第二部分中, this = [1,2,3]
可以更改此值吗?,不能通过赋值来更改,您不能为此赋值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.