2

因此,我们可以使用 Object.create 的 JavaScript 原生实现来模拟原型的 Class.create.. 但是,有 $super 的概念。

这是定义:

方法定义中的 $super 参数

当您覆盖子类中的方法,但仍希望能够调用原始方法时,您将需要对它的引用。您可以通过在前面使用额外参数定义这些方法来获得该引用:$super。Prototype 将检测到这一点,并通过该参数使您可以使用被覆盖的方法。但是对于外界来说,Pirate#say 方法仍然需要一个参数。请记住这一点。

这是他们的例子:

/** new, preferred syntax **/

// properties are directly passed to `create` method
var Person = Class.create({
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
});

// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, {
  // redefine the speak method
  say: function($super, message) {
    return $super(message) + ', yarr!';
  }
});

var john = new Pirate('Long John');
john.say('ahoy matey');

如何使用本机 JS 或 jQuery 来模仿这种行为?

4

1 回答 1

2

不使用 jQuery,因为它没有任何继承工具(除了$.extend)。

您可以简单地在本机继承模式中引用父级的原型方法,也许可以结合一个显示原型模块:

function Person(name) {
    this.name = name;
}
Person.prototype.say = function(message) {
    return this.name + ":" + message;
};

function Pirate(name) {
    Person.call(this, name);
}
Pirate.prototype = (function(super) {
    var p = Object.create(super, {
        constructor: {value: Pirate}
    });
    p.say = function(message) {
        return super.say.call(this, message) + ", yarr!";
    };
    return p;
})(Person.prototype);
于 2013-10-07T20:24:45.560 回答