2016-11-03 81 views
2
class Thing { 
    constructor(parameter) { 
    if (parameter) { 
     this.x = parameter; 
    } 
    return this; 
    } 

    getX() { 
    return this.x; 
    } 

    static specialThing() { 
    return new Thing('Special Thing'); 
    } 
} 

let thingy = Thing.specialThing(); 
thingy.getX(); // 'Special Thing' 

我想在JavaScript中完成上述操作(尽管以更复杂的形式)。当我运行这个代码时,它运行良好,但我感到奇怪的是,在类中的某个函数返回该类的实例化版本。有没有什么理由不以这种方式构建我的代码?有了ES6类,可以从静态方法返回该类的实例吗?

甲起作用的替代静态方法是:

Thing.specialThing =() => { 
    return new Thing('Special Thing'); 
}; 

什么是一些长处和短处(如果有的话),使用的这些东西任一个?有没有其他更好的方法可以实现我不知道的目标?

+1

有什么都没有错。 – Pointy

+0

这个结构在其他语言中是非常常见的,你可能还没有在js中看到它的唯一原因是因为类是JavaScript的新手。 –

+1

很酷的感谢回复@Pointy&@Pamblam! 另外一般问题 - 为什么评论答案而不是回答? – thisissami

回答

3

对于ES6类,可以从静态方法返回该类 的实例吗?

当然,这很好,在某些情况下这是可以接受的做法。当你想编写一个可重复使用的函数时,通常会使用它,可以从几个地方调用一个调用构造函数和创建对象的特定方法。

您的名为specialThing的静态函数被称为工厂函数(一种为您创建并返回对象的常规函数​​)。工厂函数可以是你展示的静态方法,也可以是其他类型对象的方法,也可以是普通函数(基本上任何类型的函数,静态或非静态)。

所以,假设你的代码中有四个地方都创建了与构造函数相同或基本相同的参数的相同类型的对象。与其将代码复制到四个地方,您只需创建一个共享函数,为您完成所有常见工作,然后可以在多个地方使用它,就像将任何其他常用代码放入共享函数一样。除了在创建和返回对象时,该类型的共享函数具有特定的名称(工厂函数)。正如我前面所说的,工厂函数可以是任何类型的函数(无论哪种函数最适合您的编码设计),所以静态方法当然是编码它的可接受方式之一。

1

有了ES6类,可以从静态方法返回该类的实例吗?

是的,在函数式编程非常常见的太

class Box { 
 
    constructor (value) { 
 
    this.value = value 
 
    } 
 
    fmap (f) { 
 
    return Box.of (f (this.value)) 
 
    } 
 
    concat ({value}) { 
 
    return Box.of (this.value + value) 
 
    } 
 
    static of (value) { 
 
    return new Box (value) 
 
    } 
 
} 
 

 
const sq = x => x * x 
 

 
let b = Box.of(3).fmap(sq).concat(Box.of(4).fmap(sq)) 
 

 
console.log (b) 
 
// { Box 3*3 + 4*4 } 
 
// { Box 25 }

相关问题