3

我正在根据我在网上找到的不同示例在 JavaScript 中练习多态性(第一次尝试)。我知道在其他语言中我可以从扩展的超类中访问超类的变量,并且想知道如何在 JavaScript 中正确执行此操作。下面的代码不会抛出任何错误(至少就 Firefox 的错误控制台而言),但statementExtendedClass.

function MyClass() {
  this.statement = "I'm a class with a method";
  this.speak = function() {
    alert(this.statement);
  }
}
var mInstance = new MyClass();
mInstance.speak();

function ExtendedClass() {
  Object.create(MyClass);
  this.speak = function() {
    alert(this.statement+" and I extend a class");
  }
}
var eInstance = new ExtendedClass();
eInstance.speak();

我可以statement从访问ExtendedClass吗?这是实现多态性的好方法吗?

4

3 回答 3

2

您可以使用MyClass.call(this)设置局部变量,然后使用 Object.create 设置原型,像这样

function MyClass() {
  this.statement = "I'm a class with a method";
  this.speak = function() {
    alert(this.statement);
  }
}
var mInstance = new MyClass();
mInstance.speak();

function ExtendedClass() {
  MyClass.call(this);
  this.speak = function() {
    alert(this.statement+" and I extend a class");
  }
}
ExtendedClass.prototype = Object.create(MyClass.prototype);
var eInstance = new ExtendedClass();
eInstance.speak();

您可以在MDN 文档中查看更多信息

于 2013-01-14T03:24:15.770 回答
1

我这样做

function MyClass() {
  this.statement = "I'm a class with a method";
  this.speak = function() {
    alert(this.statement);
  }
}
var mInstance = new MyClass();
mInstance.speak();

function ExtendedClass() {
  MyClass.call(this);
  this.speak = function() {
    alert(this.statement+" and I extend a class");
  }
}
var eInstance = new ExtendedClass();
eInstance.speak();

不确定这是否是最好的语法,但我知道这可行,并且您可以正确继承 MyClass 及其所有公共方法和变量。

于 2013-01-14T03:23:09.550 回答
1

原型是您正在寻找的。

var MyClass = function(){}; //Empty Constructor
MyClass.prototype = {
    statement: "I'm a class with a method",
    speak: function(){
        alert(this.statement);
    }
};
var ExtendedClass = function(){}; //Empty Constructor
ExtendedClass.prototype = new MyClass();
ExtendedClass.prototype.speak = function(){
    alert(this.statement+" and I extend a class");
};
var eInstance = new ExtendedClass();
eInstance.speak();
于 2013-01-14T03:23:16.167 回答