关于JavaScript中的回退构造函数模式?

时间:2017-07-16 19:16:58

标签: javascript constructor

我在创建函数方面的测试已经过测试,这些函数在JavaScript中被称为构造函数。

function Clonetrooper(name, rank, age) {
  this.name = name;
  this.rank = rank;
  this.age = age;

我已经开始使用这行代码

  if (!(this instanceof Clonetrooper)) return new Clonetrooper();
}

以防止在没有new关键字的情况下调用函数。

老师/评分员注意到以下评论。

  

这不是必要的,实际上并没有做你想要的   它要做。   这将设置'这个'然后返回一个完全独立的实例   没有设置这些属性的Clonetrooper。

公平地说,我确实忘了添加这样的道具......

if (!(this instanceof Clonetrooper)) return new Clonetrooper(name, rank, age);

但事实证明并不重要......

像这样做,(就像在原始代码中一样)

  if (!(this instanceof Clonetrooper)) return new Clonetrooper();

将返回具有这些属性的对象 - 只保留值undefined

new Clonetrooper
Clonetrooper {name: undefined, rank: undefined, age: undefined}

有人可以解释他们的意思吗?

2 个答案:

答案 0 :(得分:0)

在调用return new Clonetrooper();时,你没有传递任何参数,但它需要3个参数,导致Clonetrooper对这些name, rank, age的调用未定义,因此执行

  this.name = name;
  this.rank = rank;
  this.age = age;

在新创建的对象中将这些属性设置为undefined,这就是你得到的原因

{name: undefined, rank: undefined, age: undefined}

答案 1 :(得分:0)

  

这会设置'这个'然后返回

是主要问题。你不能运行所有的属性初始化代码,然后最终决定实际创建一个合适的新实例,你需要在一开始就拯救。

  

一个完全独立的Clonetrooper实例,没有设置这些属性。

...对于参数值,它们意味着。

顺便说一句,在现代的ES6中,你写的是

function Clonetrooper(name, rank, age) {
  if (!new.target) return new Clonetrooper(...arguments);
  this.name = name;
  this.rank = rank;
  this.age = age;
}

或立即使用class语法。