繁体   English   中英

为什么不能在原型函数中为“ this”分配新值?

[英]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.pusha.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'] ,并且ab保持不变

现在,既然您在数组中执行此操作

a=['a','b','c']

然后调用a.foo(); ,其中aa 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM