一个(有点模糊)Javascript继承问题

Ada*_*sek 5 javascript oop inheritance prototype function

我一直在尝试Javascript中的设计模式,这将允许我拥有可以被实例函数覆盖的单例函数.

这是一个简短的例子:

Date.tomorrow = function () {
  return Date.today().add(1).days();
}

(function(p) {

  p.tomorrow = function() {
    var date = this.clone().clearTime();
    return date.equals(Date.tomorrow());
  }

})(Date.prototype);
Run Code Online (Sandbox Code Playgroud)

所以有两个tomorrow()功能.直接从Date函数调用时:

>>> Date.tomorrow()
=>  Fri Jul 23 2010 00:00:00 GMT-0500 (CST) { _orient=1,  more...}
Run Code Online (Sandbox Code Playgroud)

但是,当您首先实例化Date实例时:

>>> var date = new Date()
>>> date.tomorrow()
=>  false
Run Code Online (Sandbox Code Playgroud)

我很遗憾,因为我相信你能分辨出来,但希望你能明白这一点.我的问题是:第一个tomorrow()函数与Date对象的关系是什么?究竟是什么附属于什么?

假设您使用的是普通函数,而不是构造函数.是否可以从原始函数中调用增强函数?

在构造函数中,您可以这样做:

this.constructor.functionName();
Run Code Online (Sandbox Code Playgroud)

但如果该函数未被用作构造函数,显然该constructor引用将不存在.有没有其他方法来访问增强功能?

这个问题背后的动力源于我重新组织项目JS代码的工作.我们正在实现Sprockets系统将我们的源代码分解为模块,其中基本上是在我们去的时候装饰一个基本命名空间,而不是将它们全部打包在一个不可读的内联对象定义中.

我们有一些非常大的事件连接,这很好分成单独的函数,但我宁愿不必单独调用每个函数; 相反,我想要一个可以一次调用所有子功能的超级功能.

我总是可以创建一个all()函数或者其他东西来实现这一点,但是如果调用顶级函数执行所有附加到它的子函数,那么从API的角度看它会更清晰.


感谢Francisco的回应,我现在正在实现我的想法.这是一个例子,以防任何人好奇.

var Namespace = {};

var Namespace.wireup = (function () {

  return function () {
    var self = arguments.callee;
    self.eventWireup1();
    self.eventWireup2();
  };

})();

(function (W) {

  function eventWireup1 () { console.log('first function'); };
  function eventWireup2 () { console.log('second function'); };

  $.extend(W, {
    eventWireup1: eventWireup1,
    eventWireup2: eventWireup2
  });

})(Namespace.wireup);
Run Code Online (Sandbox Code Playgroud)

这个API的好处是你可以这样做:

>>> Namespace.wireup.eventWireup1();
=>  first function
>>> Namespace.wireup.eventWireup2();
=>  second function
>>> Namespace.wireup();
=>  first function
=>  second function
Run Code Online (Sandbox Code Playgroud)

Ada*_*sek 0

由于arguments.callee已被弃用,我认为我应该用一个我最终过渡到的示例来更新这个问题,该示例既更正确又与严格模式兼容。

var Namespace = {};

(function () {
  Namespace.wireup = function self () {
    self.eventWireup1();
    self.eventWireup2();
  }
})();

(function (self) {
  self.eventWireup1 = function () { console.log('first function') }
  self.eventWireup2 = function () { console.log('second function') }
})(Namespace.wireup);
Run Code Online (Sandbox Code Playgroud)