当前位置: 首页 > 面试题库 >

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

濮阳研
2023-03-14
问题内容

我为什么可以这样做:

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

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


问题答案:

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



 类似资料:
  • 问题内容: 从风格上讲,我更喜欢这种结构: 为此结构: 从功能上讲,以这种方式构造代码是否有任何弊端?将原型方法添加到构造函数内部的原型对象中(即,在构造函数的表达式语句关闭之前)会导致意外的作用域问题吗? 在成功使用之前,我已经使用了第一种结构,但是我想确保自己不会因为调试错误而使自己陷入头痛,也不会引起开发人员的同情和痛苦。 问题答案: 从功能上讲,以这种方式构造代码是否有任何弊端?将原型方法

  • 问题内容: 我从编译器收到的错误是“分配的左侧必须是变量”。我的用例是深度复制,但并没有实际意义。 在C ++中,可以分配给。 问题不在于如何规避对的分配。这很简单,但是决定不进行变量的背后是什么原理。 原因是技术上的还是概念上的? 到目前为止,我的猜测-用随机方法重建对象的可能性容易出错(概念上),但在技术上是可行的。 编辑 请避免使用“因为Java规范这么说”的变体。我想知道 这个决定 的 原

  • 问题内容: 声明任何原始类型的数据(例如int或)时,它们会初始化为或。为什么我们不能将它们设置为? 问题答案: 基本类型就是数据。另一方面,我们称为对象的对象只是指向数据存储位置的指针。例如: 在这种情况下,它只是指向一个整数对象的指针,该对象的值恰好是3。也就是说,在存储变量对象的内存位置,你所拥有的只是对数据实际位置的引用。number另一方面,存储的存储位置直接包含值3。 因此,你可以将设

  • 当声明任何基本类型数据(如< code>int或< code>double)时,它们被初始化为< code>0或< code>0.0。为什么我们不能将它们设置为< code>null?

  • 问题内容: 今天,当我发现一段Python代码使用内置函数 作为变量标识符来存储列表推导的结果并且没有引发错误时,我偶然发现了这一点,因此我尝试了以下操作: 希望当我问为什么在Python中允许这种行为时,这是一个有效的问题。 或者更好的是,如何确保内置函数的确是真实的而不是不说,因此不会被偶然评估? 问题答案: Python希望您对您的代码负责,这就是为什么。Python没有私有属性,没有受保护

  • 问题内容: 为什么不能和这两个一起在构造函数中使用? 合并这样的东西的原因是什么? 问题答案: 将在同一类中调用另一个构造函数,而将调用超级构造函数。如果构造函数中没有,则编译器将隐式添加一个。 因此,如果两者都允许,您最终可能会两次调用构造函数。 示例(不要在参数中寻找含义): 现在,如果调用,将调用以下构造函数: 更新 : 如果您能够使用并且可能会得到如下结果: ( 注意 :这是为了说明 如果