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

关于JavaScript中的回退构造函数模式?,javascript,constructor,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关键字的情况下调用函数 老师/评

我在创建函数方面的知识进行了测试,这些函数将在JavaScript中作为构造函数调用

function Clonetrooper(name, rank, age) {
  this.name = name;
  this.rank = rank;
  this.age = age;
我已经开始练习使用这行代码

  if (!(this instanceof Clonetrooper)) return new Clonetrooper();
}
防止在没有new关键字的情况下调用函数

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

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

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

if (!(this instanceof Clonetrooper)) return new Clonetrooper(name, rank, age);
但事实证明这并不重要

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

将返回具有这些属性的对象,但这些属性仅包含值
undefined

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

那么有人能解释一下他们的意思吗?

在调用
return new Clonetrooper()时
,您没有传递任何参数,但它需要3个参数,导致调用
Clonetrooper
,这些
名称、等级、年龄
未定义,因此通过执行

  this.name = name;
  this.rank = rank;
  this.age = age;
在新创建的对象中,这些属性被设置为未定义,这就是为什么


{name:undefined,rank:undefined,age:undefined}
调用
return new Clonetrooper()时
,您没有传递任何参数,但它需要3个参数,导致调用
Clonetrooper
,这些
名称、等级、年龄
未定义,因此通过执行

  this.name = name;
  this.rank = rank;
  this.age = age;
在新创建的对象中,这些属性被设置为未定义,这就是为什么

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

这将设置“This”的属性,然后返回

这是主要问题。您不能运行所有的属性初始化代码,然后最终决定实际创建一个适当的新实例,您需要从一开始就退出

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

…对于参数值,他们的意思是


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

function Clonetrooper(name, rank, age) {
  if (!new.target) return new Clonetrooper(...arguments);
  this.name = name;
  this.rank = rank;
  this.age = age;
}
或者直接使用
class
语法

这将设置“This”的属性,然后返回

这是主要问题。您不能运行所有的属性初始化代码,然后最终决定实际创建一个适当的新实例,您需要从一开始就退出

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

…对于参数值,他们的意思是


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

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

或者直接使用
class
语法。

你期望什么?函数需要三个参数,如果不向其传递任何内容,则这些参数的值将是
未定义的
。@ibrahimmahrir将返回一个包含这些属性的对象。这似乎是正确的。试试这个:
返回新的Clonetrooper(名字,等级)以获得更好的理解(只有
年龄
未定义
)。
Clonetrooper('Rex','Major')
Clonetrooper{姓名:“雷克斯”,军衔:“少校”,年龄:未定义}Clonetrooper('Rex','Major')
Clonetrooper{};//没有道具的空对象
您期望什么?函数需要三个参数,如果不向其传递任何内容,则这些参数的值将是
未定义的
。@ibrahimmahrir将返回一个包含这些属性的对象。这似乎是正确的。试试这个:
返回新的Clonetrooper(名字,等级)以获得更好的理解(只有
年龄
未定义
)。
Clonetrooper('Rex','Major')
Clonetrooper{姓名:“雷克斯”,军衔:“少校”,年龄:未定义}Clonetrooper('Rex','Major')
Clonetrooper{};//没有道具的空对象