簡體   English   中英

試圖了解nodeJS和javascript對象

[英]Trying to understand nodeJS and javascript objects

我試圖編寫一個對象的快速示例,以及該對象的一些原型,並且從代碼中得到了一些意外的結果。 我正在使用index.js和cards.js這兩個文件。基本思想是實例化一個名為“ deck”的新對象,然后對該對象調用一些方法。 這是我的代碼

cards.js

//constructor
function cardsClass() {
        this.cards = [
                { suit: 'heart', number: 1, name: 'ace' },
                { suit: 'heart', number: 10, name: 10 },
                { suit: 'heart', number: 11, name: 'jack' },
                { suit: 'heart', number: 12, name: 'queen' },
                { suit: 'heart', number: 13, name: 'king' }
        ];
}

//class method
cardsClass.prototype.getCards = function() {
        return this.cards;
}

cardsClass.shuffle_helper = function (input_cards, return_deck, callback) {

        if (input_cards.length !=0) {
                index = Math.floor(Math.random() * input_cards.length);

                if (input_cards[index]) {
                        return_deck.push(input_cards[index]);
                        input_cards.splice(index, 1);
                }

                cardsClass.shuffle_helper(input_cards, return_deck, callback);
        }

        else {
                callback(null, 'success');

        }

}

//class method
cardsClass.prototype.shuffle = function (callback) {
        //set up a temp deck...
        var return_deck = [];

        cardsClass.shuffle_helper(this.cards, return_deck, function (err, results) {
                this.cards = return_deck;

                callback(null, this.cards);
        });
}

module.exports = cardsClass;

index.js

var cards = require('./cards.js');

deck = new cards();

console.log( deck.getCards() );

deck.shuffle(function (err, results){

        console.log ('our results of a deck.shuffle');
        console.log (results);

});

console.log ('and this is what our getCards function returns');
console.log( deck.getCards() );

console.log ('looking at deck.cards');
console.log (deck.cards);

我從運行此代碼得到的結果如下

$ node index.js
[ { suit: 'heart', number: 1, name: 'ace' },
  { suit: 'heart', number: 10, name: 10 },
  { suit: 'heart', number: 11, name: 'jack' },
  { suit: 'heart', number: 12, name: 'queen' },
  { suit: 'heart', number: 13, name: 'king' } ]
our results of a deck.shuffle
[ { suit: 'heart', number: 1, name: 'ace' },
  { suit: 'heart', number: 11, name: 'jack' },
  { suit: 'heart', number: 13, name: 'king' },
  { suit: 'heart', number: 10, name: 10 },
  { suit: 'heart', number: 12, name: 'queen' } ]
and this is what our getCards function returns
[]
looking at deck.cards
[]

看起來我從卡洗牌中得到了正確的結果,但是當我回顧“ ”中包含的內容時,即使設置了值,我也會得到意想不到的結果。 我很難理解為什么會這樣。 另外,以這種方式返回結果的形式是否較差,還是應該像在getCards方法中一樣使用傳統的“ return”語句?

提前致謝。

在回調作用域中, this.cards引用(並創建)回調函數的cards屬性。 它的范圍與最初的this.cards ,因此當您轉過身來嘗試對其進行記錄時,您正在記錄的是將所有內容拼接在一起的陣列。

有幾種方法可以使其工作。 您可以使用諸如var self = this類的內容捕獲上面的this ,然后在回調中使用該self變量。 您可以bind()的回調函數this於預期值。 或者,您可以通過返回input_cards = return_deck在結尾處設置input_cards = return_deck return_deck,或者返回合適的值。 在這種情況下,回調並不是完全必要的,因為您所做的一切都不是異步的,無論如何它都將以相同的方式流動。

cardsClass.shuffle_helper(this.cards, return_deck, function (err, results) {
        this.cards = return_deck; // Not the same "this" as above.

        callback(null, this.cards);
});

此外,這里的一些良好的閱讀關於this

其他人與你的實現(可能與價值回答特定問題this在回調)。 我發現這是簡化方式的一種方式,一種方法更容易:

  1. 這里沒有理由使用遞歸。 一個簡單的while循環就足夠了。 這使實現更簡單,更高效,並且更容易調試。

  2. 沒有理由在這里使用回調來通知完成。 這里的所有代碼都是同步的。 您可以只調用該函數,並在返回時完成結果。 回調對於進度通知或異步事件將來的某個時間的通知很有用。 當所有代碼都是同步的時,使用回調傳遞結果只是編寫代碼的一種更復雜的方式,並且沒有必要或沒有幫助。

  3. strict模式編程。 這將立即將您的編程錯誤標記為錯誤,因為this將是undefined並且this.cards會立即引發錯誤,而不僅僅是做錯事而不告訴您。

  4. 始終在變量前面使用var聲明局部變量,以避免創建意外的,隱式的全局變量,這會在遞歸或異步代碼中引起問題。

這是一個更簡單的實現:

"use strict";

//constructor
function cardsClass() {
        this.cards = [
                { suit: 'heart', number: 1, name: 'ace' },
                { suit: 'heart', number: 10, name: 10 },
                { suit: 'heart', number: 11, name: 'jack' },
                { suit: 'heart', number: 12, name: 'queen' },
                { suit: 'heart', number: 13, name: 'king' }
        ];
}

//class method
cardsClass.prototype.getCards = function() {
        return this.cards;
}

//class method
cardsClass.prototype.shuffle = function (callback) {
    //set up a temp deck...
    var shuffledCards = [];
    while (this.cards.length) {
        var index = Math.floor(Math.random() * this.cards.length);
        shuffledCards.push(this.cards[index]);
        this.cards.splice(index, 1);
    }
    this.cards = shuffledCards;
    return this;
}

工作演示: http : //jsfiddle.net/jfriend00/Lwv4cc3x/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM