gpt4 book ai didi

javascript - 重构具有相同原型(prototype)属性的对象

转载 作者:行者123 更新时间:2023-12-03 06:05:37 25 4
gpt4 key购买 nike

假设我们有一个父类(super class) Character 和 2 个子类 PlayerEnemy

var Character = function(x, y){
this.x = x || 0;
this.y = y || 0;
};
var Enemy = function() {
// randomInt returns an integer value in between 0 and 505 (canvas width)
var x = randomInt(0, 505);
var y = this.getNewRow();
Character.call(this, x, y);
};
var Player = function(x, y, hearts) {
Character.call(this, x, y);
this.hearts = hearts;
};

PlayerEnemy 都将具有原型(prototype)属性,例如 widthheightleftMargintopMargin

Enemy.prototype.width = 96; 
Enemy.prototype.height = 65;
Enemy.prototype.leftMargin = 2;
Enemy.prototype.topMargin = 78;

Player.prototype.width = 66;
Player.prototype.height = 75;
Player.prototype.leftMargin = 18;
Player.prototype.topMargin = 64;

由于子类 PlayerEnemy 都有这 4 个属性(尽管具有不同的值),我觉得应该以某种方式重构它,但是如何重构呢?由于这些类的每个实例都将具有相同的属性值,因此我确实想利用原型(prototype)链并将它们保留在原型(prototype)对象中(除非您可以向我解释为什么我不应该这样做)。

最佳答案

我根本不会做出这样的区分,也不会依赖继承。我更喜欢组合而不是继承,这样当变化发生时我就不会被锁在我的继承框中。在这种情况下还要考虑过早的过度设计,您真的希望通过将这些属性存储在对象本身中来解决性能问题吗?我的设计是你有一个 Angular 色,它具有 x、y、心、宽度、高度、leftMargin、topMargin、类型属性。因此,通过这种方式,您可以获得非常灵活的一致数据,这将满足您 future 的需求:

  • 敌人可以通过改变类型来交出 friend
  • 敌人在某个时间点也可以拥有红心,为什么不可以?
  • 所有 Angular 色都可以通过改变宽度/高度来放大/缩小
  • 所有 Angular 色都可以通过改变边距来改变位置。

基本上,您将拥有一个通用的数据结构来进行操作,而无需费力维护您的层次结构模型。希望这会对您有所帮助。

关于javascript - 重构具有相同原型(prototype)属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com