小编典典

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

javascript

我为什么可以这样做:

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

我怀疑这是因为允许分配意味着我可以将数组更改为其他内容(例如字符串),但是我希望那里的人可以肯定并且/或者有更详细的解释。


阅读 285

收藏
2020-05-01

共1个答案

小编典典

不允许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仅仅因为调用了某种方法,这对于调用者来说将非常混乱。

2020-05-01