在创建新的子类对象时,设置在父类中定义的变量

时间:2015-01-16 20:30:55

标签: javascript

我一直在努力学习Javascript的继承结构的来龙去脉,我遇到了这个问题。我试图创建几个子类对象,并通过在创建时传递变量来立即为它们赋值。

例如,在父类GamePiece下面创建一个随机属性作为变量,并将其设置为myProperty,当然在创建新的GamePiece对象时工作正常。但是,如果我想在创建Pawn对象时设置该变量,则它不会传递到其父级并保持未设置状态。显而易见的解决方法是在子类上再次定义变量,但如果我错了,请纠正我,这似乎打败了定义父类的目的。您还可以通过将参数作为Pawn.prototype = new GameObject("foo");传递来成功设置变量,但在创建多个Pawn()对象时没有帮助。有没有一种常见的方法可以解决这个问题?



var GamePiece = function (randomProperty) {
  this.myProperty = randomProperty || "never set";
  this.print = function () {
    console.log(this.myProperty);
  }
}

var Pawn = function (randomProperty) {
  this.print = function () {
    console.log(this.myProperty);
  }
}

//Setting a value on creation
piece = new GamePiece("foo");
piece.print(); // Produces "foo" naturally

//Setting the prototype
Pawn.prototype = new GamePiece();

//Try to pass value through the creation of subclass
pawn = new Pawn("foo");
pawn.print(); // Produces "never set"




1 个答案:

答案 0 :(得分:0)

您必须使用thiscall方法在当前apply的上下文中调用您的父类:

var GamePiece = function (randomProperty) {
    this.myProperty = randomProperty || "never set";
    this.print = function () {
        console.log(this.myProperty);
    }
}

var Pawn = function (randomProperty) {
    Game.call(this, randomProperty);
    // or Game.apply(this, [randomProperty]);
}

但是将方法保留在原型中会更好。所以下一个代码会更好:

var GamePiece = function (randomProperty) {
    this.myProperty = randomProperty || "never set";

    //... some another properties initialization
};

GamePiece.prototype.print = function () {
    console.log(this.myProperty);
};

var Pawn = function (randomProperty) {
    Game.call(this, randomProperty);
    // or Game.apply(this, [randomProperty]);

    //... some Pawn properties initialization
};

Pawn.prototype = Object.create(Game.prototype, { constructor: { value: Pawn }});

Pawn.prototype.someMethod = function() {
    // Some Pawn method logic
};

但ES6即将到来(将于2015年6月成为recommendation),因此您可以开始准备使用它们。请参阅hereherehere