如果我將一個類導入到其他腳本中,如何將參數傳遞給ES6語法中的類構造函數?如何將構造函數參數傳遞給ECMAScript 6中的導入類?
我想做這樣的事情。我已經看到了各種建議,如包裝功能或使用工廠模式,但有沒有更簡單的方法做到這一點?
// This is sudo code
import SomeClass from './SomeClassPath';
var thing = SomeClass(params);
如果我將一個類導入到其他腳本中,如何將參數傳遞給ES6語法中的類構造函數?如何將構造函數參數傳遞給ECMAScript 6中的導入類?
我想做這樣的事情。我已經看到了各種建議,如包裝功能或使用工廠模式,但有沒有更簡單的方法做到這一點?
// This is sudo code
import SomeClass from './SomeClassPath';
var thing = SomeClass(params);
我看到你的問題存在一些混淆,所以讓我澄清一下。
在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'
};
客戶端代碼不會改變這裏。
不知道你在做什麼。它總是'新SomeClass(params)'(它是一個單參數,順便說一句)。請解釋你想要做什麼。 – estus
嗯我認爲使用導入某些類提供該類的單例實例,無論多少次導入被調用。這是不是真的? –
這適用於您要導入的任何東西。類實例不會自動生成單例。它只執行一次導入的文件,這就是'singleton'事情發生的方式。除非你用它來導出一個像'export const someClassInstance = new SomeClass'這樣的單例,這不是一個問題。 – estus