2016-12-16 24 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