2

如果我在“构造函数”中添加一个函数,我可以使用其他函数来扩展它,如下所示:

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this.time(), "HH:mm"); }
}

如果我像这样在原型中创建函数,我想不出一个很好的方法来做到这一点:

var MyClass = function() {}
MyClass.prototype = {
    time: function() { return 4.5; },
    time.formatted: function () { ... } // This does not work!
}


MyClass.prototype.time.formatted = function() { ... }
// the line above works but I don't like it since it separates everything.
// e.g. if I have 15 functions inside prototype, the .formatted will be like
// 50 lines apart from the time: function

*编辑:*重新考虑上面的行不起作用,添加 .formatted 混乱对此的引用。也许可以解决?

有小费吗?谢谢!

4

2 回答 2

2

在创建原型对象之前创建函数,它允许您向其添加属性,并且还使您能够在不使用的情况下使用该函数this

function MyClass() {}

function time() { return 4.5; }
time.formatted = function() { return format(time(), "HH:mm"); }

MyClass.prototype = {
    time: time;
}

您可以将其放在函数表达式中以将其保持在一起,并避免将time函数置于全局范围内:

function MyClass() {}
MyClass.prototype = (function(){

  function time() { return 4.5; }
  time.formatted = function() { return format(time(), "HH:mm"); }

  return {
    time: time;
  }

})();

注意:该formatted函数将作为常规函数调用,而不是作为对象的方法。这意味着该函数在从函数调用时time无权访问。thisformatted

如果您需要,您根本无法time在原型中拥有该功能。类的每个实例都需要自己的time函数版本,其中formatted属性可以访问对象的特定实例:

function MyClass() {

  this.theTime = 4.5;

  this.time = function() { return this.theTime; }

  var t = this;

  this.time.formatted = function() { return format(t.time(), "HH:mm"); }

}
于 2013-02-17T10:22:09.280 回答
1

此代码不起作用:

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this.time(), "HH:mm"); }
}

var m = new MyClass();
console.log(m.time.formatted())

因为this里面.formatted指向m.time,不是m。你应该使用:

var MyClass = function() {
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(this(), "HH:mm"); }
}

或者

var MyClass = function() {
    var self = this;
    this.time = function() { return 4.5; }
    this.time.formatted = function() { return format(self.time(), "HH:mm"); }
}

回答您的实际问题,创建一个辅助函数:

var callable(f, props) {
    for(p in props) f[p] = props[p];
    return f;
}

MyClass.prototype = {
    time: callable(function() {
        return 4.5;
    }, {
        formatted: function () { return format(this(), "HH:mm"); }
    })
}
于 2013-02-17T10:16:25.887 回答