编写一个名为Group的类(因为Set已经被采用)。与Set一样,它有add、delete和方法。它的构造函数创建一个空组,add向组添加值(但仅当它还不是成员时),delete从组中删除其参数(如果它是成员),并返回一个布尔值,指示其参数是否是组的成员。
使用===运算符或indexOf等等效运算符来确定两个值是否相同。
为类提供一个静态from方法,该方法以一个可迭代对象为参数,并创建一个包含对其进行迭代所产生的所有值的组
这是我需要解决的问题,下面是我的代码,它给出了错误
这里的错误是:
未捕获类型错误:this.add不是函数
我不知道为什么这里需要这个静态方法,请告诉我。并帮助我清除这个错误。
class Group {
constructor() {
this.group = [];
return this;
}
add(value) {
if (!this.has(value)) {
this.group.push(value);
return this;
}
}
delete(value) {
if (this.has(value)) {
this.group = this.group.filter(x => x !== value)
return this;
}
}
has(value) {
return this.group.includes(value)
}
static from(iterableObject) {
for (let value of iterableObject) {
this.add(value);
}
return this;
}
}
let group = Group.from([10, 20]);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
//→ false
目标是:
为类提供一个静态from方法,该方法将可迭代对象作为参数,并创建一个包含通过对其进行迭代生成的所有值的组。
因此,在方法内部,您需要
创建一个组
可以使用new Group
,然后使用
包含通过迭代产生的所有值
,循环引用新创建的组,然后返回创建的组。
static from(iterableObject) {
const group = new Group();
for (const value of iterableObject) {
group.add(value);
}
return group;
}
class Group {
constructor() {
this.group = [];
return this;
}
add(value) {
if (!this.has(value)) {
this.group.push(value);
return this;
}
}
delete(value) {
if (this.has(value)) {
this.group = this.group.filter(x => x !== value)
return this;
}
}
has(value) {
return this.group.includes(value)
}
static from(iterableObject) {
const group = new Group();
for (const value of iterableObject) {
group.add(value);
}
return group;
}
}
let group = Group.from([10, 20]);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
//→ false
我不知道为什么这里需要这种静态方法
静态方法可以被认为在外观上类似于独立函数(就其调用方式而言),只是它是类本身的属性。你可以等效地进行
const createGroupFrom = (iterable) => {
// implementation here
};
但静态通常表示函数与类相关,而不与一个特定的已存在实例绑定。(与处理现有实例直接相关的方法被实现为非静态常规方法。
在这种情况下,常规方法显然不起作用,因为它不会在现有实例上调用——现有实例不存在。因此,选项是有一个简单的独立函数,或者一个静态方法(如果喜欢的话),并且给出的要求是使用静态方法。
如MDN:所述
static关键字为类或类静态初始化块定义静态方法或属性(有关此用法的更多信息,请参阅链接)。静态方法和静态属性都不能在类的实例上调用。相反,它们是在类本身上调用的。
在静态方法中,
static from(iterableObject) {
for (let value of iterableObject) {
this.add(value);
}
return this;
}
但是您要做的是设置对新Group
实例的引用,并返回该实例:
class Group {
constructor() {
this.group = [];
return this;
}
add(value) {
if (!this.has(value)) {
this.group.push(value);
return this;
}
}
delete(value) {
if (this.has(value)) {
this.group = this.group.filter(x => x !== value)
return this;
}
}
has(value) {
return this.group.includes(value)
}
static from(iterableObject) {
var newGroup = new Group(iterableObject);
for (let value of iterableObject) {
newGroup.add(value);
}
return newGroup;
}
}
let group = Group.from([10, 20]);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
//→ false