2016-07-30 10 views
0

Meine Aufgabe ist es, eine Bank zu erstellen enthält mehrere Konten. Die Bank benötigt eine Methode, die den gesamten Geldbetrag auf den Konten zurückgibt. Außerdem benötigt es eine addAccount-Methode, die ein neues Konto bei der Bank anmeldet und es dem Konto-Array hinzufügt. Sie sollten in der Lage sein, einzahlen oder von einem Konto abheben, um das Guthaben zu ändern. Stellen Sie sicher, dass die Konten keine negativen Werte haben können. Schreiben Sie eine Überweisung auf die Bank, mit der Sie Beträge zwischen zwei Konten überweisen können.Erstellen eines grundlegenden Banksystems, Stichwort "this" in Javascript

Mein Problem ist es, eine Möglichkeit zu finden, die Details jedes Benutzers (Name, Kontostand) auszudrucken. Ich habe das Gefühl, dass es einen Link gibt, den ich verpasst habe, indem ich das Schlüsselwort this anwende. Hier ist mein Code:

var account = function (name, balance){ 

    account.name = name; 
    account.balance = balance; 

    account.deposit = function (depositAmount) { 
    newBalance = account.balance - depositAmount; 
    console.log("Your balance is now " + newBalance); 
    if (newBalance <= 0) { 
     console.log("You have insufficient funds!!!"); 
    } 
    }; 

    account.withdraw = function (withdrawAmount){ 
    newBalance = account.balance - withdrawAmount; 
    console.log("Your balance is now " + newBalance); 
    if (newBalance <= 0) { 
     console.log("You have insufficient funds!!!"); 
    } 

    }; 

    account.transfer = function (transferAmount){ 
//got stuck here 
    } 

    console.log("Name: " + name + "; Balance: " + balance); 
} 


var AustinAccount = new account ("Austin", 500); 
var KateAccount = new account ("Kate", 10000); 
var GingerAccount = new account ("Ginger", 70000000); 
var OreoAccount = new account ("Oreo", 900000000); 
+0

Was ist Ihre Frage? –

+0

Funktioniert der Code? Hast du Fehler bekommen? – Krii

+0

Ja, ich fand alle Antworten sehr hilfreich. Ich glaube, ich hatte Schwierigkeiten zu verstehen, wie ich das Schlüsselwort verwenden soll. Ich lerne immer noch, dass dies meine erste Woche ist, die Javascript tut. Tausend Dank! – yangmei

Antwort

2

Tipps und Tricks

die von den Grundlagen Lassen Sie beginnen:

Bauer mit Großbuchstaben beginnen sollte:

function Account(name, balance) { 

} 

Dann wird, wie @Ibar sagte, sollten Sie this verwenden, um das zu verweisen Konstruktorinstanz, anstatt sie über den Namen aufzurufen.

function Account(name, balance) { 
    this.name = name; 
    ... 
} 

Dann können Sie jede Instanz Eigenschaft Zugriff mit:

var account = new Account('Hey', 100); 
console.log(account.name); 

Auch die richtige Art und Weise Methoden eines Konstruktor zu definieren ist:

function Account(name, balance) { 

} 

Account.prototype.deposit = function(arg) { 

} 

Arbeits Skript

Hier finden Sie ein funktionierendes Skript, habe ich zwei private Methoden hinzugefügt (_isPositive und _isAllowed), die überprüfen, ob der angegebene Betrag positiv ist, und ob es genug Geld auf dem Konto nach einer bestimmten Transaktion geben wird.

function Account(name, balance) { 
 
    this.name = name; 
 
    this.balance = balance; 
 
} 
 

 
Account.prototype.deposit = function(amount) { 
 
    if (this._isPositive(amount)) { 
 
    this.balance += amount; 
 
    console.info(`Deposit: ${this.name} new balance is ${this.balance}`); 
 
    return true; 
 
    } 
 
    return false; 
 
} 
 

 
Account.prototype.withdraw = function(amount) { 
 
    if (this._isAllowed(amount)) { 
 
    this.balance -= amount; 
 
    console.info(`Withdraw: ${this.name} new balance is ${this.balance}`); 
 
    return true; 
 
    } 
 
    return false; 
 
} 
 

 
Account.prototype.transfer = function(amount, account) { 
 
    if (this.withdraw(amount) && account.deposit(amount)) { 
 
    console.info(`Transfer: ${amount} has been moved from ${this.name} to ${account.name}`); 
 
    return true; 
 
    } 
 
    return false; 
 
} 
 

 

 
Account.prototype._isPositive = function(amount) { 
 
    const isPositive = amount > 0; 
 
    if (!isPositive) { 
 
    console.error('Amount must be positive!'); 
 
    return false; 
 
    } 
 
    return true; 
 
} 
 

 
Account.prototype._isAllowed = function(amount) { 
 
    if (!this._isPositive(amount)) return false; 
 

 
    const isAllowed = this.balance - amount >= 0; 
 
    if (!isAllowed) { 
 
    console.error('You have insufficent funds!'); 
 
    return false; 
 
    } 
 
    return true; 
 
} 
 

 
const a = new Account('a', 100); 
 
const b = new Account('b', 0); 
 

 

 
output.innerText += `before: a: ${a.balance}, b: ${b.balance}\n`; 
 

 
a.transfer(100, b); 
 

 
output.innerText += `after: a: ${a.balance}, b: ${b.balance}\n`;
<div id=output></div>


Verbesserungen

Sie können dann Ihr Skript weiter verbessern ein Protokoll der Transaktionen hinzufügen, und vielleicht sogar eine Art und Weise verschiedene Banken

const fooBank = new Bank('foo'); 
const fezAccount = new fooBank.Account('fez', 0); 
zu verwalten

Hoffe es hilft.

+0

Das ist sehr hilfreich, danke! Würde es Ihnen etwas ausmachen zu erklären, was ein Prototyp ist und warum haben Sie ihn in diesem Fall benutzt? – yangmei

+0

Mir ist auch aufgefallen, dass Sie anstelle von 'var' stattdessen 'const' verwendet haben. Gibt es Unterschiede? – yangmei

+0

'const' ist ein neues Feature von JS, mit dem man Konstanten definieren kann, die nach der Definition nicht mehr editiert werden können. Über 'prototype', lesen Sie https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype. Denken Sie daran, die Antwort als korrekt zu markieren. –

1

Innen account Funktion, sollten Sie account durch this ersetzen.

var account = function (name, balance){ 
    this.name = name; 
    this.balance = balance; 

    this.deposit = function (depositAmount) { 
     ... 
    } 
} 

Nach einem account Objekt erstellen, können Sie AustinAccount.balance rufen Informationen über das Objekt abzurufen.

0

Schauen Sie sich diese JSBin: http://jsbin.com/jiheqotaye/edit?js,console

Alles Fez sagte genau das, was Sie beachten müssen, wenn eine einfach zu verstehende Schreiben Konstruktor.

Mit der transfer Methode; Sie möchten überprüfen, ob der übergebene Wert account eine Instanz desselben Konstruktors ist. Überprüfen Sie dann, ob die withdraw erfolgreich ist, und fahren Sie dann mit der Einzahlung fort.

Account.prototype.transfer = function (transferAmount, account){ 
    if (account instanceof Account) { 
    if (this.withdraw(transferAmount)) { 
     account.deposit(transferAmount); 
     return true; 
    } else { 
     console.log("An error occured withdrawing that amount"); 
     return false; 
    } 
    } 
    console.log("Provided account was not an account with our bank"); 
    return false; 
}; 

Hoffe, dass hilft!

+0

Warum die 'instanceof' überprüfen? Wenn zwei Banken eine kompatible API teilen, sollten Sie die Übertragungen nicht blockieren: P –

+0

'' instanceof''' ist eine vereinfachte Version der strikten Gewährleistung der API-Kompatibilität. Ich würde nicht wollen, dass mein Geld versehentlich in irgendeinem alten Objekt landet;) – horyd

+0

Ich sehe, ja, pass besser auf dein eigenes Geld auf. –