2011-04-19 116 views
3

我的問題可能是最好的例子。在javascript中,我習慣於能夠做到這樣的東西:關於ColdFusion中的類,實例和方法的困惑

// create a simple class 
function myClass() { 
    this.attr_example = "attribute"; 
} 
myClass.prototype.do_something = function() { 
    return "did something"; 
} 

// create an instance of it, and modify as needed 
var thing = new myClass(); 
thing.myMethod = function(arg) { 
    return "myMethod stuff"; 
} 

// ... so that this works as expected 
console.log(thing.myMethod()); 
console.log(thing.do_something()); 
console.log(thing.attr_example); 

當談到在ColdFusion中做類似的事時,我陷入了困境。我經常發現自己想要做的事情是這樣的:

<cfscript> 
    // thing.cfc contains a normal cfcomponent definition with some methods 
    var thing = createObject("component","Thing"); 
    function formattedcost() { 
    return "#LSCurrencyFormat(this.cost)#"; 
    } 
    thing.formattedcost = formattedcost; 
</cfscript> 
<cfoutput> 
    #thing.formattedcost()# 
</cfoutput> 

假設,對於這個問題,它沒有任何意義添加「formattedcost」作爲Thing類的方法,因爲它是純粹的表象。我們還假設只需在<cfoutput>標籤中使用#LSCurrencyFormat(thing.cost)#就足夠了,因爲我們需要Thing的實例由模板系統(本例中爲小鬍子)進行評估。甚至更進一步,我想避免創建另一個.cfc文件來擴展我的Thing類以添加幾個方法。

我該怎麼辦? ColdFusion中可以使用這種編程風格嗎?

回答

7

是的,你可以這樣做:

Thing.cfc

<cfcomponent output="false" accessors="true"> 
    <cfproperty name="cost" type="numeric"> 
    <cffunction name="init" output="false" access="public" 
     returntype="any" hint="Constructor"> 
     <cfargument name="cost" type="numeric" required="true"/> 
     <cfset variables.instance = structNew()/> 
     <cfset setCost(arguments.cost)> 
     <cfreturn this/> 
    </cffunction> 
</cfcomponent> 

test.cfm

<cfscript> 
    // thing.cfc contains a normal cfcomponent definition with some methods 
    thing = new Thing(725); 
    function formattedcost() { 
    return "#LSCurrencyFormat(getCost())#"; 
    } 
    thing.formattedcost = formattedcost; 
</cfscript> 
<cfoutput> 
    #thing.formattedcost()# 
</cfoutput> 

結果

$725.00 
+0

謝謝!我想我快到了!但這確實引發了進一步的問題:''做了什麼? – 2011-04-19 19:50:16

+0

對不起,這是我編寫我的CFC時使用的鍋爐代碼。你不需要它。 – orangepips 2011-04-19 19:55:31

+1

嗨@DustMason,@orangepips set語句會創建一個內部實例變量,以便您可以將持久數據存儲在CFC中而不會泄漏出對象。對於不希望外部應用程序需要使用的對象中所有方法需要使用的變量,這是一件好事。 – 2011-04-20 19:36:13