0

現金自動預け払い機を作成するために、基本的な関数を作成しようとしています。以下のコードを実行するたびに、合計が 0 のままになります。誰か助けてくれたり、理由を説明してくれませんか?

function VirtualCashMachine(){

    //object storing food
    this.food = {egg: 0.98, milk: 1.23, magazine: 4.99,chocolate: 0.45};

    //total bill
    this.total = 0;
    //record of last transaction
    this.lastTransactionAmount = 0;

    //assign public methods
    this.scan = scan;
    this.voidLastTransaction = voidLastTransaction;       

    //define public methods    

    //add amount to total property
    function scan(/*string*/item,/*integer*/ quantity){

        //if food item exists in food object, find price and calculate total
        if(this.food.hasOwnProperty(item)){

            cost = this.food[item] * quantity;
            add(cost);
            this.lastTransactionAmount = cost;

        }
    };

    function voidLastTransaction(){
        this.total -= lastTransactionAmount; 
    };

    //define private method

    //add item price to total
    function add(itemCost){
         this.total = this.total + itemCost; 
    };
}

var VCM = new VirtualCashMachine();
VCM.scan("egg", 3);


console.log(VCM.total);

add 関数を実装したときに問題が発生したようです。私の推論は、この例で 3 つの卵の合計コストを見つけたら、その金額を に追加し、this.total他の種類の食品についてこれを繰り返すことができるということです。

4

2 に答える 2

3

これのプロパティになるように add を書き直します。

this.add = function (itemCost) {
  this.total = this.total + itemCost; 
}
于 2013-10-26T19:52:53.310 に答える
3

「これ」は、多くの場合、あなたが思っているものではありません...つまり、コンテキストなしで(addの代わりにVCM.scan)関数を呼び出すと、コンテキストはグローバルオブジェクトに設定されます。このテーマに関する記事はたくさんあります。つまり、JavaScript コンテキストの理解です。

それに対処するためのいくつかのオプションがあります。

1 つは、tomca32 で提案されているように「パブリック メンバー」にすることで、コンテキストを使用して呼び出すことです (多くの場合、望ましくないプライベート メソッドが公開されることに注意してください)。

this.add = function(itemCost) { this.total += itemCost;} this.add(cost);

別のオプションは、ローカル変数に保存thisして、何を使用しているかを正確に把握することです。

function VirtualCashMachine(){
   var self = this;
   ....
   function add(itemCost){
     self.total = self.total + itemCost; 
};

または、明示的にコンテキストを渡すことができますfunction.call:

function add(itemCost) { this.total += itemCost;}
add.call(this, cost);

またはthis、ローカル関数で完全に回避できますが、get/set メソッドでプロパティを公開する必要があります。この場合、関数は親のスコープ内のすべてのローカル変数を参照するため、合計を正しく変更できます。

var total = 0;
this.getTotal() { return total;} 
function add(itemCost) { total += itemCost;}

2番目のアプローチ(ローカル変数へのコピーthisを使用)は非常に一般的で、私の意見では従うのが最も簡単です。クラス内のどこでもself(または他の一般的に使用されるmeor )を使用するだけです。thatthis.

于 2013-10-26T19:56:30.557 に答える