2017-04-21 46 views
0

如果我將一個類導入到其他腳本中,如何將參數傳遞給ES6語法中的類構造函數?如何將構造函數參數傳遞給ECMAScript 6中的導入類?

我想做這樣的事情。我已經看到了各種建議,如包裝功能或使用工廠模式,但有沒有更簡單的方法做到這一點?

// This is sudo code 
import SomeClass from './SomeClassPath'; 
var thing = SomeClass(params); 
+0

不知道你在做什麼。它總是'新SomeClass(params)'(它是一個單參數,順便說一句)。請解釋你想要做什麼。 – estus

+0

嗯我認爲使用導入某些類提供該類的單例實例,無論多少次導入被調用。這是不是真的? –

+1

這適用於您要導入的任何東西。類實例不會自動生成單例。它只執行一次導入的文件,這就是'singleton'事情發生的方式。除非你用它來導出一個像'export const someClassInstance = new SomeClass'這樣的單例,這不是一個問題。 – estus

回答

1

我看到你的問題存在一些混淆,所以讓我澄清一下。

在ES6中,您可能知道在需要導出模塊時有兩種策略。您可以使用默認導出多個導出。讓我們以一個非常基本的例子(約console一個簡單的記錄器):

function info(msg) { 
    console.info(`[Info] ${msg}`); 
} 

function error(msg) { 
    console.error(`[Error] ${msg)`); 
} 

默認出口

這裏要組我們的功能。在JavaScript這樣做的最慣用的方法是使用對象文本(見顯露的模塊模式):

export default { 
    info(msg) { 
    console.info(`[Info] ${msg}`); 
    }, 
    error(msg) { 
    console.error(`[Error] ${msg}`); 
    } 
}; 

然後,在我們的客戶端代碼,我們將使用這個模塊,像這樣:

import logger from './logger' 

logger.info('Hello!'); 
logger.error('Oops!'); 

多出口

在這裏我們可以自主出口我們的功能:

export function info(msg) { 
    console.info(`[Info] ${msg}`); 
} 

export function error(msg) { 
    console.error(`[Error] ${msg}`); 
} 

然後,在我們的客戶端代碼,我們將使用這個模塊,像這樣:

import {info, error} from './logger' 

info('Hello!'); 
error('Oops!'); 

完成。

我建議您理解ES6模塊系統如何與我們的功能示例一起工作。這與類別完全一樣......


單身?

通過閱讀評論,我看到了另一個需要澄清的混淆:Singleton

Singleton是一種設計模式,它可以實例化一個類一次。現在想象一下,我們班是:

export default class Person { 
    constructor(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    } 
}; 

我們可以用這樣的:

import Person from './Person'; 

let me = new Person('Baptiste', 'Vannesson'), 
    you = new Person('David', 'Choi'); 

console.log(Object.is(me, you)); // false, so there are two instances of Person 
console.log(me.firstName, me.lastName); // Baptiste Vannesson 
console.log(you.firstName, you.lastName); // David Choi 

正如你所看到的,人無關與辛格爾頓!這將是一個Singleton與下面的Java風格的實現:

export default (() => { 

    class Person { 
    // Private constructor 
    constructor(firstName, lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
    } 

    return { 
    // Public static factory method 
    getInstance(firstName, lastName) { 
     if (!Person.instance) { 
     Person.instance = new Person(firstName, lastName); 
     } 
     return Person.instance; 
    } 
    }; 

})(); 

客戶端代碼:

import Person from './Person'; 

let me = Person.getInstance('Baptiste', 'Vannesson'), 
    you = Person.getInstance('David', 'Choi'); 

console.log(Object.is(me, you)); // true, so there is only one instance 
console.log(me.firstName, me.lastName); // Baptiste Vannesson 
console.log(you.firstName, you.lastName); // Baptiste Vannesson (still me!) 

爲了簡單起見,你可能更喜歡一個實例直接導出:

class Person { 
    constructor(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    } 
}; 

export default new Person('David', 'Choi'); 

客戶編號:

import person from './person'; 

// Person is not a constructor but a simple instance 
let me = person, 
    you = person; 

console.log(Object.is(me, you)); // true 
console.log(me.firstName, me.lastName); // David Choi 
console.log(you.firstName, you.lastName); // David Choi 

如果你這樣做,這將是更簡單的使用對象文本:

export default { 
    firstName: 'David', 
    lastName: 'Choi' 
}; 

客戶端代碼不會改變這裏。

相關問題