继承

2017-04-21 76 views
0

我在Node.js创建了一些类如Controllers我的路线,我希望他们能够在一个单身的基础上工作的静态函数(不是必须的,这是一个额外的)继承

主控制器类

class RouteController { 

    static getInstance() { 
     if (!RouteController.singleton) { 
      RouteController.singleton = new RouteController(); 
     } 

     return RouteController.singleton; 
    } 
} 

现在我想创建例如观看帖子的路线,我想这个类有单件模式为好,但不是警察

PostController的类

class PostController extends RouteController { 

} 

如果我这样做,并检查它console.log(RouteController.getInstance() === PostController.getInstance())它返回true当我希望每个(子)类具有自己的单例实例。

我该如何正确地做到这一点?

回答

2

一个简单的方法是,看看你singleton属性的this一个实例。即使您在对任何派生类执行此操作之前调用RouteController.getInstance(),这也会起作用。

class RouteController { 
 
    log() { 
 
    return 'Route'; 
 
    } 
 
    static getInstance() { 
 
    if (!(this.singleton instanceof this)) { 
 
     // Only called twice so you can verify it's only initialized 
 
     // once for each class 
 
     console.log('Creating singleton...'); 
 
     this.singleton = new this(); 
 
    } 
 
    return this.singleton; 
 
    } 
 
} 
 

 
class PostController extends RouteController { 
 
    log() { 
 
    return 'Post'; 
 
    } 
 
} 
 

 
console.log(RouteController.getInstance().log()); 
 
console.log(PostController.getInstance().log()); 
 
console.log(RouteController.getInstance().log()); 
 
console.log(PostController.getInstance().log());

+0

这工作!谢谢! – CreasolDev

0

功能的正常规则适用。因此,你可以使用this里面的功能来指代方法上(构造函数本身在这种情况下)调用的对象:

class RouteController { 

    static getInstance() { 
     if (!this.singleton) { 
      this.singleton = new this(); 
     } 

     return this.singleton; 
    } 
} 

然而,这仍然无法工作,如果RouteController.getInstance()直接调用,因为那样的话所有的子类都会继承一个静态的singleton属性,导致每个子类的!this.singleton测试失败。

有多种方法可以解决这个问题。一个是使用getOwnProperty不是直接访问它的:

if (!this.getOwnProperty('singleton')) { 

} 
+0

我不认为你可以访问'this'在静态方法,你呢? –

+1

@RobM .:每个函数都有一个'this'值(箭头函数除外)。如果你使用'RouteController.getInstance()','this'指向'RouteController'。普通的JavaScript,这里没什么神奇的。毕竟,静态方法只是函数对象的属性。 ('Route RouteController(){}; RouteController.getInstance = function(){}')。 –

+1

我应该改写一下,我知道会有一个'this'值,我只是不知道它会用静态方法引用这个类本身,并且有点惊讶。很高兴知道,谢谢! –