2015-10-14 182 views
0

我試着深入理解javascript,我已經實現了我想要做的事情,但我確信有更好的方法。Javascript默認功能

我有這樣的代碼:

var props = { 
    val: 'foo', 
    test: function() { 
    console.log(this.val); 
    } 
} 

function testFactory() { 
    var myFunc = function() { 
    myFunc.test(); 
    }; 
    myFunc.__proto__ = props; 
    return myFunc; 
} 

這讓我有特性的功能:

var test = testFactory(); 
test(); // "foo" 
test.val = 'bar'; 
test(); // "bar"; 

的問題是,新的「myFunc」被重建,每次我跑「testFactory()」 。 我很確定我能以更好的方式做到這一點?!

Thak你提前。

編輯

你的答案和意見後:

function testFactory() { 
    var myFunc = function() { 
    myFunc.test(); 
    }; 
    Object.assign(myFunc, props); 
    return myFunc; 
} 
+0

什麼是你的定義「更好的方法」? – Jamiec

+1

您確定要覆蓋函數的原型嗎?另外,工廠還在做什麼比創建新實例? –

+0

不,每次都無法創建新的'myFunc'。因爲顯然這就是'testFactory'要做的事情,所以創建一個新的對象是一個函數。 – Bergi

回答

2

首先,你不想這樣做:

myFunc.__proto__ = props; 

...因爲那樣會使該功能會丟失它從Function.prototype繼承的功能,如call,applybind。 (__proto__也是JavaScript的browser-only extension;如果你真的想在構造它之後改變一些東西的原型,這通常暗示着設計問題,那麼正確的方法是使用Reflect.setPrototypeOf。[這是ES2015的特性])

要指定屬性的功能,只是分配屬性給它:

function foo() { 
    console.log("I'm foo"); 
} 
foo.bar = "xyz"; 
foo(); // "I'm foo" 
console.log(foo.bar); // "xyz" 

函數是對象,就像任何其他的對象,你可以把他們自己的屬性。

如果你想分配一堆屬性,在ES2015可以用Object.assign

Object.assign(foo, { 
    bar: "xyz", 
    baz: 123 
}); 

(在ES2015預代碼,你可以只使用一個循環。)