我想知道如何在引擎盖下的coldfusion中实例化cfc!我知道你创建了一个组件实例,你将获得对新创建的实例的引用,你可以使用它来调用它们内部的公共方法。
但是当我编写代码
时究竟发生了什么<cfscript>
person = createObject('component','human') // what happen here!!!!
person.speak();
</cfscript>
对我的陈述做了一些修正!!!我问这个问题的原因是因为我有一个存储在应用程序范围内的实例,而实例的使用方法如下所示
application.person.speak();
现在负载非常高。我发现内存不是为obj而发布的,并且在某些时候它达到了200mb ..奇怪! 。因此,按照最佳实践中的说法进行了修正
request.person = duplicate(application.person);
现在有另一个直接的方法来做到这一点
request.person = createObject('component','human');
区别,第一个创建对象并将其保持在共享范围内,每次发出请求时都要执行深层复制(此处实例仅创建一次)。第二个是每次发出请求时都会创建实例。它们之间存在性能差异,因为在第二种方法中,每次都会创建实例。我想知道创建一个实例背后的架构究竟是什么,使它不如前者更好!!
只是想知道!
答案 0 :(得分:3)
Coldfusion编译成Java,当你调用“createObject”函数时,你正在创建该类的实例。以下是一些可能有助于解释的链接:
http://www.bennadel.com/blog/325-ColdFusion-CreateObject-vs-Java-NewInstance-.htm
http://blog.objectorientedcoldfusion.org/2009/07/16/coldfusion-9-object-creation-performance/
答案 1 :(得分:0)
根据我的理解,它在cfc中运行init方法/函数,然后运行speak方法/函数。
答案 2 :(得分:0)
那里发生了什么?没什么特别的。
对于CFC,init()
只是一种用于初始化实例的方法。如果您不需要构造函数,则甚至不需要CFC。但是,它通常包含在社区采用的约定中,源自ColdFusion选择使用init()
来调用Java构造函数。*
function init()
{
// init vars in Variable scope if needed...
return this;
}
在CF9中,当您使用new
运算符时,如果它可用,它将为您调用init()
,如果您的CFC没有{{1},它将不会抛出任何错误方法定义。
*在调用Java方法时,init()
被转换为调用Java类的正确构造函数。如果您只想调用类的静态方法,请直接调用该方法而不使用init()
。