我一直看到这样的工厂功能的例子。
const dog = () => {
const sound = 'woof'
return {
makeSound: () => console.log( sound )
}
}
const poodle = dog()
poodle.makeSound() // woof
但是这样一来,每创建一个狗,都会在内存中多创建一个makeSound函数.如果函数是在创建的对象外部,只是让对象像这样传递给声音函数,是不是会好很多?
const dog = () => {
return {
sound: 'woof'
}
}
const makeSound = obj => console.log( obj.sound )
const poodle = dog()
makeSound( poodle ) // woof
把函数放在工厂函数创建的每个对象内,和把它放在外面,然后把你要运行函数的对象传给它有什么好处?
其优点是 开发商的清晰度 该 makeSound()
是特定的东西 Dog
s.
假设你不知道函数的定义。
的代码。
makeSound(arg);
是有效的 任何 参数。或者没有,就像它一样(那么它就会被认为是 undefined
).
没有什么能阻止开发人员调用
const myUnrelatedObject = { foo: "bar" };
makeSound(myUnrelatedObject); // compiles and returns no error (will just print "undefined")
而 "面向对象 "的方式会抛出一个 运行时错误
myUnrelatedObject.makeSound(); // TypeError: makeSound is not a function
代码良好实践模式是为人类开发者而生的!
但你说的没错,有一个开销。而这对于很多语言来说都是一样的,说到面向对象的模式。
如果这实际上对性能有冲击的 你的 应用程序,你可以而且应该考虑在内存和可读性(以及软件维护成本)之间进行权衡。
但作为 "默认",我强烈建议(为了你、你的同事和你的公司)你选择以下路径 可读性 和 维护性 第一。
另外,请记住,你应该真正衡量在真实情况下的性能影响。现在的JavaScript编译器引擎可以很好地优化代码,特别是如果它是以一种通常的、可预测的方式编写的。