2017-05-30 32 views
1

我想创建一个BankAccount类,其中新实例跟踪新实例的检查和节省。然而,每当有人创建一个新实例时,我想要一个静态方法,它调用一个静态字段,该字段仅与BankAccount类相关,该类可以跟踪有多少银行帐户已打开(有点像单例行为)。这在c#/ java中是可行的,但很难在Javascript中重新创建预期的行为。有问题在ES6类中创建静态字段(非方法,基元)?

我在ES5尝试这很好,但短了,我来我一直在寻找使用功能的包装来封装行为最接近的事:

function BankAccountMaker() { 
    var countOfAccounts = 0; 
    function IncrementcountOfAccounts() { 
     countOfAccounts += 1; 
    } 

    function BankAccount(c = 0) { 
     this.checking = 0; 
    } 

    return { 
     makeBankAccount: function (c) { 
      IncrementcountOfAccounts(); 
      console.log(countOfAccounts) 
      return new BankAccount(c); 
     } 
    } 
} 

最终,几个要求:

  1. 有人可以编码ES6相当于上述?
  2. 另外,有没有更好的方法来做到这一点在ES5中,我不需要包装?
  3. 在ES5中,我们可以将原型方法设置为原语,但似乎并不像ES6语法那样呢? (我正在使用Node 6.1和Babel fwiw)
+0

“*静态字段只绑BankAccount类,保存着众多的银行账户是如何开放轨道*” - **不要**。这正是为什么(全局/静态,可变)单身人士不好。它泄漏内存并且不是模块(不可测试)。将跟踪记录保存在创建实例的方法中。完全像你对你的'BankAccountMaker'所做的一样。 – Bergi

+0

“* ES5中我们可以如何将原型方法设置为原语,但似乎并不像ES6语法那样?*” - 请为此提出一个单独问题,并为您的意思提供示例代码。顺便说一下,方法不是原语。 – Bergi

+0

对代码的改进:1)内联'IncrementcountOfAccounts' 2)将'BankAccount'放在'BankAccountMaker'之外,它不是需要访问计数的闭包 - 这将避免重新创建相同的类。然后将其转换为ES6,只需将“BankAccount”设置为“类”即可。 – Bergi

回答

2

我已经为每个银行帐户添加了一个id。所以你可以遍历你创建的账户。 incrementcountAccounts是一个坏主意,因为你不知道银行账户是否真的被创建。

您不能这样做:BankAccount(c = 0)参数在ES5中不受支持。

一些片段:

/** 
 
* Bank 
 
*/ 
 
class Bank { 
 
    constructor(name, id) { 
 
    this.countOfAccounts = 0; 
 
    this.id = id; 
 
    this.name = name; 
 
    
 
    console.log('--- ' + this.name + ' ---'); 
 
    } 
 

 
    incrementcountOfAccounts() { 
 
    this.countOfAccounts += 1; 
 
    } 
 
    
 
    addBankAccount(...data) { 
 
    this.incrementcountOfAccounts(); 
 
    
 
    return new BankAccount(this.id, ...data); 
 
    } 
 
} 
 

 
/** 
 
* BankAccount 
 
*/ 
 
class BankAccount { 
 
    /** 
 
    * Constrctor 
 
    * @param {Number} bankId  
 
    * @param {Number} [amount=0] 
 
    * @param {Number} [checking=0]    
 
    */ 
 
    constructor(bankId, amount = 0, checking = 0) { 
 
    if(!bankId) { 
 
     throw Error('no bank id'); 
 
    } 
 
    
 
    this.account = { 
 
     bankId, 
 
     checking, 
 
     amount 
 
    }; 
 
    } 
 
    
 
    /** 
 
    * Get bank id 
 
    * @return {number} 
 
    */ 
 
    get bankId() { 
 
    return this.account.bankId; 
 
    } 
 

 
    /** 
 
    * Set amount 
 
    * @param {number} value 
 
    * @return {number}  
 
    */ 
 
    set amount(value) { 
 
    this.account.amount = value; 
 
    } 
 

 
    /** 
 
    * Get ammunt 
 
    * @return {number} 
 
    */ 
 
    get amount() { 
 
    return this.account.amount; 
 
    } 
 

 
    /** 
 
    * set checking 
 
    * @param {number} value 
 
    * @return {number}  
 
    */ 
 
    set checking(value) { 
 
    this.account.checking = value; 
 
    } 
 

 
    /** 
 
    * get checking 
 
    * @return {number} 
 
    */ 
 
    get checking() { 
 
    return this.account.checking; 
 
    } 
 
} 
 

 
const FirstBank = new Bank('First Bank', 1); 
 

 

 
const bankAccount1 = FirstBank.addBankAccount(300); 
 
const bankAccount2 = FirstBank.addBankAccount(4000); 
 

 

 
console.log('Account 1: ' + bankAccount1.amount + ' - ' + bankAccount1.checking + ' - ' + bankAccount1.bankId); 
 
console.log('Account 2: ' + bankAccount2.amount + ' - ' + bankAccount1.checking + ' - ' + bankAccount1.bankId); 
 

 

 
console.log('Accounts first Bank: ' + FirstBank.countOfAccounts); 
 

 
const SecondBank = new Bank('Second Bank', 4); 
 
const bankAccount3 = SecondBank.addBankAccount(0, 1); 
 
console.log('Account 3: ' + bankAccount3.amount + ' - ' + bankAccount1.checking + ' - ' + bankAccount1.bankId);  
 
console.log('Accounts second Bank: ' + SecondBank.countOfAccounts);

ES5:

var BankAccountMaker = function() { 
 
    this.countOfAccounts = 0; 
 
    
 
    this.IncrementcountOfAccounts = function() { 
 
    this.countOfAccounts += 1; 
 
    } 
 
    
 
    this.BankAccount = function() { 
 
    this.checking = 0; 
 
    } 
 
    
 
    this.makeBankAccount = function (c) { 
 
    this.IncrementcountOfAccounts(); 
 

 
    return new this.BankAccount(c); 
 
    } 
 
} 
 

 
const Bank = new BankAccountMaker(); 
 

 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.countOfAccounts);

ES5原型:

function BankAccountMaker() { 
 
    this.countOfAccounts = 0; 
 

 
} 
 

 
BankAccountMaker.prototype.IncrementcountOfAccounts = function() { 
 
    this.countOfAccounts += 1; 
 
} 
 

 
BankAccountMaker.prototype.BankAccount = function() { 
 
    this.checking = 0; 
 
} 
 

 
BankAccountMaker.prototype.IncrementcountOfAccounts = function() { 
 
    this.countOfAccounts += 1; 
 
} 
 

 
BankAccountMaker.prototype.makeBankAccount = function(c) { 
 
    this.IncrementcountOfAccounts(); 
 
    console.log(this.countOfAccounts); 
 
    
 
    return new this.BankAccount(c); 
 
} 
 

 
const Bank = new BankAccountMaker(); 
 

 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.makeBankAccount(3)); 
 
console.log(Bank.countOfAccounts);

+0

感谢您的详细报道。我认为我没有足够好地阐述我的原始问题 - 我期待的是像C#/ Java中那样的静态字段行为。也就是说,根据您提供的答案以及Bergi,这不仅仅是ES6语言的一个特色。 – mche

相关问题