0

我知道有很多方法可以进行 JS 继承。我正在尝试在这里做一些事情,在这里我将传递给我的子类,并且我想在构造函数时将它传递给超类:

function AbstractTableModel(rows) {

    this.showRows = function() {
        alert('rows ' + this.rows);
    }
}

function SolutionTableModel(rows)  {

    this.prototype = new AbstractTableModel(rows);

    this.show = function() {
        this.protoype.showRows();
    };
}

var stm = new SolutionTableModel(3);

stm.show();

小提琴:

http://jsfiddle.net/YuqPX/2/

它似乎不起作用,因为原型方法没有流下来:(有什么想法吗?

4

4 回答 4

4

现场演示

首先你必须定义this.rows

function AbstractTableModel(rows) {
    this.rows = rows;
    this.showRows = function() {
        alert('rows ' + this.rows);
    };
}

其次,如果你想继承AbstractTableModel你应该这样做......

function SolutionTableModel(rows)  {
    AbstractTableModel.call(this, rows);

    this.show = function() {
        this.showRows();
    };
}

SolutionTableModel.prototype = new AbstractTableModel();

var stm = new SolutionTableModel(3);

stm.show();

/================================================== ==============================/

如果您想避免两次调用基本构造函数,也可以使用寄生组合继承模式:

function inheritPrototype(subType, superType) {
    var prototype = Object.create(superType.prototype, {
        constructor: {
            value: subType,
            enumerable: true
        }
    });
    subType.prototype = prototype;
}

function AbstractTableModel(rows) {
    this.rows = rows;
    this.showRows = function () {
        alert('rows ' + this.rows);
    };
}

function SolutionTableModel(rows) {
    AbstractTableModel.call(this, rows);

    this.show = function () {
        this.showRows();
    };
}

inheritPrototype(AbstractTableModel, SolutionTableModel);

var stm = new SolutionTableModel(3);

stm.show();
于 2013-06-27T16:05:14.397 回答
2
function AbstractTableModel(rows) {
  this.rows = rows;
  this.showRows = function() {
    alert('rows ' + this.rows);
  }
}

function SolutionTableModel(rows) {
  var soln = Object.create(new AbstractTableModel(rows));
  soln.show = function() {
    this.showRows();
  };
  return soln;
}
var solution = new SolutionTableModel(5);
solution.show();

这是进行对象继承的一种方式。这种方法在我看来是最优雅的,可以在这里找到详细信息

小提琴

于 2013-06-27T16:11:44.020 回答
1
function AbstractTableModel(rows) {
    this.rows = rows;        
}

AbstractTableModel.prototype.showRows = function() {
    console.log('rows ' + this.rows);
}

function SolutionTableModel(rows)  {
    AbstractTableModel.call(this, rows);

    this.show = function() {
        this.showRows();
    };
}

SolutionTableModel.prototype = Object.create(AbstractTableModel.prototype);

var stm = new SolutionTableModel(3);

stm.show();
于 2013-06-27T16:12:10.293 回答
1

这是一个基于您所做的工作示例DEMO

function AbstractTableModel(rows) {
    this.showRows = function () {
        alert('rows ' + rows);
    }
}

function SolutionTableModel(rows) {
    var self = this;
    this.prototype = new AbstractTableModel(rows);
    this.show = function () {
        self.prototype.showRows();
    };
}

var stm = new SolutionTableModel(3);
stm.show();
  1. 在你的课堂AbstractTableModel上没有this.rows直接使用rows
  2. 二等舱也一样SolutionTableModel。我更喜欢定义self指向创建的对象实例的变量。
  3. 你错过protoype了应该是的类型prototype
于 2013-06-27T16:12:19.153 回答