2016-05-13 7 views
0

私は実際のプロトタイプの継承について、関数の代わりにオブジェクトのみを使用してKyle Simpsonに従っています。 Object.createとObject.assignを使ってオブジェクトにミックスインを追加することができたかどうかを確認したかったのです。私はさらにそれをさらに進めて、ミックスインのプロパティの値の一部をベースオブジェクトのプロパティの値に基づいてベースにしました。私はいつも一緒に働こうとしている価値のためにNaNを取得します。コードは次のとおりです:Object.assign()を使用して他のオブジェクトから基本オブジェクトのプロパティを参照する方法

function generatorFactory() { 
    var basePlayer = { 
     x: 0, 
     y: 0, 
     baseHealth: 50 
    }; 

    var generatePlayer = function() { 
     return basePlayer; 
    }; 
    return generatePlayer; 
} 

var playerGenerator = generatorFactory(); 
var basicPlayerObject = playerGenerator(); 

var heavyArmor = { 
    defense: 15, 
    attack: 9 
}; 

var lightArmor = { 
    defense: 7 
}; 

var swordsman = { 
    health: this.baseHealth + 10 
}; 

var knifeFighter = { 
    health: this.baseHealth - 10 
}; 

var sigurd = Object.assign(Object.create(basicPlayerObject), heavyArmor, swordsman); 

console.log(sigurd.health); 
console.log(sigurd.defense); 
console.log(sigurd.attack); 
console.log("Player coordinates: (" + sigurd.x + ", " + sigurd.y +")"); 

私は剣士ミックスインでプレイヤーのベースヘルスを調整したいと思います。私は 'this'を使ってみましたが、助けにはなりませんでした。私はこれが完全に間違っていると思っています。私はここで間違って何をしているのですか?

+0

"*関数の代わりにオブジェクトのみを使う*" - あまり意味がない。関数をメソッドとして使用していますが、関数を使用してオブジェクトを作成しないと、柔軟性が失われます。 – Bergi

+0

これを開梱できますか?私はまだprototypal継承で作業するこの他の方法を学んでいるので、私はそれを正しく理解したり、正しく表現していないかもしれません。 – redeagle47

答えて

1

問題は、あなたがthisを使用している方法です。あなたがオブジェクトを定義している場合は、thisはまだ周囲範囲ではなく、あなたが定義している新しいオブジェクトを参照:

var self = this; 
var swordsman = { 
    checkThis: self === this // true 
}; 

あなたが何をしようとして達成するための一つの方法は、それらのオブジェクトを変更することです関数に変換する。

function initSwordsman(obj) { 
    obj.health = obj.baseHealth + 10; 
} 
var sigurd = Object.assign(Object.create(basicPlayerObject), heavyArmor); 
initSwordsman(sigurd); 
+1

さて、私はあなたが意味するものを参照してください。 「this」はグローバルスコープを指していました。ミックスインがベースオブジェクトに割り当てられるか、または再評価されるまで評価されないことを望んでいました。私はなぜそれが動作しないかを参照してください。ありがとう、私はタイマーがなくなるとすぐに答えを受け入れるよ。 – redeagle47

1

this in your object literalsは、あなたが期待するものを指すものではありません。あなたはそれが動的プロパティは上のアクセスされたオブジェクトを参照したい場合は、ゲッターを使用する必要があります:

var swordsman = { 
    health: { 
     get() { return this.baseHealth + 10; }, 
     enumerable: true, 
     configurable: true 
    } 
}; 

var knifeFighter = { 
    health: { 
     get() { this.baseHealth - 10 }, 
     enumerable: true, 
     configurable: true 
    } 
}; 

、あなたはObject.create代わりのObject.assignにそれらのプロパティ記述子を渡す必要があります。

var sigurd = Object.assign(Object.create(basicPlayerObject, swordsman), heavyArmor); 
関連する問題