如何在JavaScript工厂函数中使用原型?

如何在JavaScript工厂函数中使用原型?,javascript,factory-pattern,prototype-chain,Javascript,Factory Pattern,Prototype Chain,我最近对JavaScript中的工厂函数模式感兴趣。课程可能很干净,但我发现他们也有自己的问题。(我甚至不打算谈论它们,因为这根本不是这个问题的目的。) 然而,我不清楚工厂功能的一个主要方面 如果我错了,请纠正我,但在JavaScript类中,我的方法被放置在结果对象的原型上,因此它们只创建一次。这意味着类内部使用的构造函数不会将方法作为属性添加到每个新对象中,这在概念上意味着这些方法属于类而不是对象实例 类示例{ 构造函数(消息){ this.message=消息; } sayMessage(

我最近对JavaScript中的工厂函数模式感兴趣。课程可能很干净,但我发现他们也有自己的问题。(我甚至不打算谈论它们,因为这根本不是这个问题的目的。)

然而,我不清楚工厂功能的一个主要方面

如果我错了,请纠正我,但在JavaScript类中,我的方法被放置在结果对象的原型上,因此它们只创建一次。这意味着类内部使用的构造函数不会将方法作为属性添加到每个新对象中,这在概念上意味着这些方法属于类而不是对象实例

类示例{
构造函数(消息){
this.message=消息;
}
sayMessage(){
console.log(this.message);
}
}
让a=新示例(“你好!”);
a、 sayMessage();//“你好!”
log(Object.getOwnPropertyNames(a));
//输出[“消息”]
Example.prototype.sayMessage=函数(){
console.log(this.message+“Modified!”);
};
设b=新示例(“你好!”);
b、 message=“再见!”;
b、 sayMessage();//输出“再见!修改!”
在上面的类中,
sayMessage
对于类的每个实例都是相同的函数。正如所演示的,它甚至可以在以后的原型上更改,从而更新类的所有现有实例。我不能肯定我是否认为这是件好事,但这肯定是有道理的

然而,在工厂函数中,返回的对象似乎只是将所有需要的方法作为普通属性附加到它

功能示例(消息){
设sayMessage=function(){
console.log(this.message);
};
返回{
讯息:讯息,,
sayMessage:sayMessage
};
}
让a=示例(“你好!”);
a、 sayMessage();//“你好!”
log(Object.getOwnPropertyNames(a));
//输出[“消息”,“说消息”]
//修改原型毫无意义,因为
//我们没有明确地在那里放置任何方法
设b=示例(“你好!”);
b、 message=“再见!”;
b、 sayMessage();//“再见!”
我想谈谈这个问题。因此,首先,避免原型部分是使用工厂函数的全部要点吗?为什么我们不创建一个函数一次,而恢复到在每个实例上复制它呢

我喜欢这样的想法,当我使用工厂函数时,我可以更好地控制我在最终对象中公开的内容,因为我可以在闭包中保持私有,但是我仍然可以使用原型继承类模型吗?或者是一个更好的问题:我愿意吗?我发现反对工厂函数的一个主要论点是,它们比性能关键型应用程序中的类慢。这不是原因之一吗?为每个新对象创建一大堆方法听起来像是巨大的浪费。这听起来像是拥有一个原型的全部意义

这里有很多问题。让我把一切都说清楚。我想听听rational对于不使用原型(或者相反地使用原型)会是什么样的,以及是否有一个解决方案包含了这两个方面的优点


编辑:当我第一次发布问题时,我的第二个代码示例正在使用
new
关键字创建
example
实例,这是一个打字错误。

sayMessage
放在
示例上。工厂函数示例中的原型
是没有意义的。(我以前用
new
调用了factory函数,这是一个输入错误,如果这是混淆的话,我很抱歉。我已经更正了代码。)
Example
只不过是一个返回对象的函数。它的原型与返回的对象没有任何联系。我的意思是。。。您返回的对象将在创建时返回。。。如果将所有方法都作为属性应用,则它们将成为属性。如果您附加了一个共享方法的公共原型,那么就会有一个共享方法的公共原型。没有什么神奇的事情发生。完全可以使用带有工厂功能的原型。我想你很少看到它,因为a)在共享方法时不能使用闭包,闭包作为方法样式是工厂的一个常见应用程序b)创建的对象通常没有那么多方法,因此不值得付出额外的努力c)你可以轻松共享函数(而不是继承的属性)通过在
示例
工厂之外声明
sayMessage