[英]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
在回調)。 我發現這是簡化方式的一種方式,一種方法更容易:
這里沒有理由使用遞歸。 一個簡單的while循環就足夠了。 這使實現更簡單,更高效,並且更容易調試。
沒有理由在這里使用回調來通知完成。 這里的所有代碼都是同步的。 您可以只調用該函數,並在返回時完成結果。 回調對於進度通知或異步事件將來的某個時間的通知很有用。 當所有代碼都是同步的時,使用回調傳遞結果只是編寫代碼的一種更復雜的方式,並且沒有必要或沒有幫助。
以strict
模式編程。 這將立即將您的編程錯誤標記為錯誤,因為this
將是undefined
並且this.cards
會立即引發錯誤,而不僅僅是做錯事而不告訴您。
始終在變量前面使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.