そこで、私は John Resig の Secrets of a JavaScript Ninja を読み、ECMAScript 5 に関する Doug Crockford の講演を見て、Object.create() のブラウザー サポートを調べ、JavaScript でオブジェクトと継承を操作する最善の方法に取り組んでいます。
オブジェクトと継承を作成する簡単な方法だと思うものを思いついたのですが、いくつかの落とし穴などを完全に見落としているかどうかを尋ねたかっただけです。ここにいくつかのコードがあります:
// OOP - game enemy example
// Let's create a base enemy type, and two enemies that inherit from it.
// Enemies must be kept track of (how many have been "instantiated").
// Enemies will need to have HP, speed and names.
// Enemies will need to be able to take damage independent of other enemies.
// It must be possible to cause all enemies to double HP and speed or halve them.
// Enemy
function Enemy (name) {
var enemy = {};
enemy.name = name;
enemy.currentHp = Enemy.baseHp * 100; // basic enemies have 100 hit points
enemy.currentSpeed = Enemy.baseSpeed * 5; // basic enemies have 5 speed
enemy.hp = Enemy.hp;
enemy.speed = Enemy.speed;
Enemy.count += 1; // Count each instantiated bad guy
return enemy;
}
// Enemy properties (these are the same for all enemies)
Enemy.count = 0;
Enemy.baseHp = 1; // if we change this to 1.3 or .5 all the enemies in the game will be boosted or deminished...
Enemy.baseSpeed = 1; // ...same here.
// getter and setter for hp
Enemy.hp = function (value) {
if (!!value) {
return this.currentHp = ((this.currentHp * Enemy.baseHp) + value);
}
return this.currentHp * Enemy.baseHp;
};
// getter and setter for speed
Enemy.speed = function (value) {
if (!!value) {
return this.currentSpeed = ((this.currentSpeed * Enemy.baseSpeed) + value);
}
return this.currentSpeed * Enemy.baseSpeed;
};
// Trio enemy
function Trio (name1, name2, name3) {
var trio = Enemy();
trio.name = [name1, name2, name3];
trio.currentHp = Enemy.baseHp * 30; // trios have less hp...
trio.currentSpeed = Enemy.baseSpeed * 10; // ...but more speed
Enemy.count += 3; // they raise the enemy count by three
return trio;
}
// Boss enemy
function Boss (name) {
var boss = Enemy(null);
boss.name = name;
boss.currentHp = Enemy.baseHp * 300; // Bosses have lots of hp...
boss.currentSpeed = Enemy.baseSpeed * 1; // ...but they're super slow
Enemy.count += 1;
return boss;
}
それで、私は何かを見逃していますか、それとも私の基準を満たしていますか? コンストラクターや「新規」よりも通常の関数を使用すると、パフォーマンスが大幅に低下しますか? それとも Object.create ですか?どういうわけかメモリをオーバーロードしていますか?Enemy.someMethod を使用して一度だけメモリ内に作成しているすべての敵に対して同一の関数があると確信しています。フィードバックをいただければ幸いです。列挙可能または書き込み可能などの属性を調整する必要がある場合は、「偽の」コンストラクター内で Object.defineProperties (または両方のパラメーターを指定した Object.create) を使用できますよね? このような...
// Flyer
function Flyer (name) {
var flyer = Enemy();
// Using Object.defineProperties to assign attributes to properties.
Object.defineProperties(flyer, {
name: {value: name, enumerable: true},
currentHp: {value: Enemy.baseHp * 50, writable: true, enumerable: true},
currentSpeed: {value: Enemy.baseSpeed * 3, writable: true, enumerable: true},
});
Enemy.count += 1;
return flyer;
}
ご意見をお待ちしております。