Prototypejs $super的原生 JS 实现

Native JS implementation to Prototypejs's $super

本文关键字:JS 实现 原生 super Prototypejs      更新时间:2023-09-26

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

这是定义:

方法定义中的$super参数

当您重写子类中的方法,但仍希望能够 调用原始方法,您将需要对它的引用。您可以 通过使用额外的参数定义这些方法来获取该引用 在前面:$super。原型将检测到这一点并使 通过该参数可以使用的重写方法。但对 在外界之外,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来模仿这种行为?

不使用 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);