javascript:在函数内添加函数.prototype = {

时间:2013-02-17 10:06:28

标签: javascript

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

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混乱 对此的参考。也许可以解决?

任何提示?谢谢!

2 个答案:

答案 0 :(得分: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函数调用时,函数this无法访问formatted

如果您需要,根本不能在原型中使用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"); }

}

答案 1 :(得分: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"); }
    })
}