使用“ .call”创建一个新的JavaScript对象,而不是“ new”

时间:2019-03-15 10:49:40

标签: javascript prototype

我正在Chrome控制台上尝试以下命令。我可以使用new(下面的第2行)创建对象,但无法使用call。谁能解释原因?

function ObjConstructor(){ this.sample = 1};

let withNew = new ObjConstructor();

let usingCall = ObjConstructor.call({});

usingCall
undefined  //output that came on console, this is not a command

withNew
ObjConstructor {sample: 1} //output that came on console

3 个答案:

答案 0 :(得分:3)

new做的几件事包括:

  • 创建对象
  • 为该对象设置this
  • 导致该函数默认返回该对象

您的代码:

  • 使用{}手动创建对象
  • 使用thiscall()值设置为该对象

…但是不做最后一件事。函数中没有return语句,因此它返回undefined

答案 1 :(得分:3)

call的结果是函数返回的结果。您的ObjConstructor没有返回任何东西,因此调用它的结果是undefined.

相反,当您使用new时,将创建一个新对象并将其传递给该函数,除非该函数返回非null对象,否则将为new创建该对象是new表达式的结果。

这就是new版本有效但call无效的原因。

还要注意,call根本不会创建对象。在您的ObjConstructor.call({})中,创建对象的是{},而不是call。它不会以ObjConstructor.prototype作为其原型。 ({{}是原始对象初始化程序,因此对象将以Object.prototype作为其原型。)

答案 2 :(得分:0)

尝试一下。 或者看看这个-> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

len(max(teststring.split(' '), key=len))