如果我在“构造函数”中添加一个函数,我可以使用其他函数扩展它:
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混乱 对此的参考。也许可以解决?
任何提示?谢谢!
答案 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"); }
})
}