关于JavaScript中的回退构造函数模式?
我在创建函数方面的知识进行了测试,这些函数将在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关键字的情况下调用函数 老师/评
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{};//没有道具的空对象