在javascript中将新方法添加到Array.prototype

时间:2018-08-08 17:46:27

标签: javascript

我是Java语言的新手,最近我开始研究js原型,并被以下代码中的一些奇怪输出所迷惑:

Array.prototype.print = function() {
  console.log(this)
}

[1, 2, 3, 4].print();

谁能告诉我为什么返回

  

无法读取未定义的属性'print'

如果我声明var array = [1, 2, 3, 4],然后用array.print()调用print函数,它可以正常工作,所以我很困惑这有什么不同?

Array.prototype.print = function() {
  console.log(this)
}

var array = [1, 2, 3, 4]
array.print()

2 个答案:

答案 0 :(得分:6)

您可以只添加一个分号来分隔对该函数的访问。

您所拥有的是函数表达式的property accessor,并带有逗号运算符,这些运算符返回4进行访问。在这种情况下,ASI(automatic semicolon insertion)不起作用。

Array.prototype.print = function() {
  console.log(this)
}[1, 2, 3, 4] //.print();   // tries to get property 4 of the function
                            // and then tries to call a function from undefined

在函数表达式的block语句后需要分号。

Array.prototype.print = function() {
  console.log(this)
};

[1, 2, 3, 4].print();

答案 1 :(得分:1)

如果一次性运行整个代码块,则不能保证最后一行将在第一个代码块之后运行。

分别运行两个块将突出显示此差异,您将看到第二个块的正确输出。

首先运行:

Array.prototype.print = function() {
  console.log(this)
}

然后运行:

[1, 2, 3, 4].print();

有几种方法可以使它们异步运行。一种简单的方法是将最后一行包装在setTimeout中(根据您的用法,这可能不合适)。

例如

Array.prototype.print = function() {
  console.log(this)
}

setTimeout(()=> { 
    [1, 2, 3, 4].print();
}, 1000)