2016-12-16 22 views
0

假設你有一個Javascript對象,並想向它添加一些方法或屬性,我首先想到的方式是簡單地擴展它的原型對象,就像這樣。哪個更適合用lodash擴展Javascript對象?有什麼不同?

someObject.prototype.someMethod =() => doSomething() 

我認爲這是我們所有人在白天做的方式。 但是,如果你使用lodash,你可以更加優雅地做同樣的事情,如果你感覺將來會增加更多的方法,看起來很容易。

_.assign(someObject, { 
    someMethod:() => doSomething(), 
}) 

我看到一些代碼和博客這樣做,但我想知道爲什麼不只是做這樣的事情?

_.assign(someObject.prototype, { 
    someMethod:() => doSomething(), 
}) 

這兩者之間究竟有什麼不同,究竟哪個更好?

+0

如果你可以編輯你的問題,以消除對意見的請求(「哪個更好」),這將是對話題。但是,您可能還想研究Object.assign,這本質上是lodash的分配使用的內容:http://stackoverflow.com/q/37123425/215552 –

+0

如果問題是關於擴展原型vs實例,爲什麼只限於Lodash ? – estus

回答

2

將屬性添加到對象的prototype屬性幾乎沒用,除非該對象碰巧是要用作構造函數的函數。如果這是不是也是一個函數的任何對象,prototype只是一個普通的屬性:

var obj = {}; 
try { 
    obj.prototype.someProp = 5; // Throws error, obj.prototype is undefined 
} catch (e) { 
    obj.prototype = {}; // Nothing special about this 
    obj.prototype.someProp = 5; // or this 
    obj.someProp === undefined; // true 
} 

添加屬性的一個對象(不是原型屬性)的實際原型會影響與同一原型的所有對象:

var obj = {}; 
Object.getPrototypeOf(obj).someProp = 5; 
var obj2 = {}; 
obj2.someProp === 5; // true 

這似乎並不是你想要的。

_.assignObject.assign延長實際的對象:

var obj = {}; 
Object.assign(obj, { someProp: 5 }); 
obj.someProp === 5; // true 
+0

非常明確的解釋。非常感謝。 – Dave