2013-12-11 103 views
4

我試圖讓這個:原型屬性的功能

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; 
} 

然後,我想不富的多個實例創建方法'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' 

回答

1

不幸的是,沒有辦法通過原型鏈向屬性添加一些功能。函數在其原型鏈中有一個對象,即Function.prototype。沒有辦法創建具有其他[[Prototype]]的功能。

你可以來你想要的最接近的是這兩個例子:

您的解決方案

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財產/方法。除非要從新版本的語言中移植功能,否則更改預定義的原型通常是不被接受的。

+0

是的,我發現[類似的問題](http://stackoverflow.com/questions/16596117/can-you-create-functions-with-custom-prototypes-in-javascript)。答案與此類似 - 現在有辦法做到這一點。 – Dmitry

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 
+0

目標是讓'f()'工作。 – Dmitry

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

+0

是的,但函數本身'f()'不起作用。那是目標。 – Dmitry