我正试图解决这个问题:
a = new Foo(name); // a is function
a(); // returns a result
a.set(); // returns another result
我已经像上面那样实现了:
function Foo (name) = {
val = name;
ret = function () { return val; }
ret.set = function (v) { return val = v; }
return ret;
}
然后,对于Foo的多个实例,我不想创建方法'set',而是通过prototype属性共享它。但是,我所做的所有实验都没有效果。它仅适用于对象,而不适用于函数。即使是下面的代码也不起作用:
foo = function () { return 'a'; }
foo.foo = function () { return 'foo'; }
foo.prototype.bar = function () { return 'bar'; }
foo(); // a
foo.foo(); // foo
foo.bar(); // Uncaught TypeError: Object function () { return 'a'; } has no method 'bar'
答案 0 :(得分:1)
遗憾的是,无法通过原型链仅向某些功能添加属性。函数在其原型链中有一个对象,即Function.prototype
。无法创建具有其他[[Prototype]]
s。
最接近你想要的是这两个例子:
您的解决方案
function Foo (name) = {
val = name;
ret = function () { return val; }
ret.set = function (v) { return val = v; }
return ret;
}
更改Function.prototype
Function.prototype.set = function (v) { return this.val = v; };
function Foo (name){
ret = function () { return this.val; }
ret.val = name;
return ret;
}
var f = new Foo('myfunc');
f.set('myval');
console.log(f.val);
我强烈推荐第一个解决方案,因为在第二个解决方案中,每个函数都共享set
属性/方法。更改预定义的原型通常是不受欢迎的,除非它是从该语言的新版本移植功能。
答案 1 :(得分:0)
在上一个示例foo
中,不具有函数bar
,只有它的原型才有。
因此,只有foo
个对象具有函数bar
所以你可以这样做:
foo = function () { return 'a'; }
foo.foo = function () { return 'foo'; }
foo.prototype.bar = function () { return 'bar'; }
var f = new foo(); // [object]
f.foo(); // TypeError: Object [object Object] has no method 'foo'
f.bar(); // bar
答案 2 :(得分:0)
试试这个:
foo = function (name){
this.name = name;
}
foo.prototype.set = function(name){ return this.name = name; }
var f = new foo('yourName');
alert(f.name);
f.set('yourNameEdited');
alert(f.name);
这是DEMO