繼續默唸一次,函數就是對象
在前面一文中,我寫了YUI的一個屬性設置的例程
在例程中,有這句話this.addAttrs(attris);,這一句位於Connector函數中,這讓我在思考一個問題,不知道理解是否準確:
“函數是對象,對函數的調用就是調用函數的構造子!”
函數的定義是函數對象的類對象,函數的構造子就是函數的調用,構造出的(實例化的)函數對象將引發一個過程的執行
例子:
//定義一個函數對象
function test(){
alert("test")
}
//函數實例化,調用構造子test()
test(); //test()引發 test (as function)的創建,函數被創建後的直接結果就是“線程的運行”;
於是我有了一個新的想法,簡化函數構造子調用, 前一篇YUI的例程我們用(function structrue()()) 作爲構造子,下面我們簡化他
按照前面的思路:
//定義obj,由於javascript沒有類字節碼加載然後生成類對象的過程,
//所以我們直接寫出來的函數定義就是類對象了
function obj(namexxx){
this.structrue = function(_name){ //定義一個structrue函數
this.name = _name;
};
this.name = "";
this.structrue(namexxx); //讓structrue函數的真構造充當obj的僞構造
}
var obj1 = new obj("2222");
alert(obj1.name); //alert("2222");
ok!! 前面YUI屬性的例子程序也可改下了:
YUI().use('event-custom', 'attribute', 'node', function(Y) { //應用attribute模塊
function Connector(url) {
this.structure = function(_url){
Y.augment(Connector, Y.EventTarget);
Y.augment(Connector, Y.Attribute); //屬性設置
this.publish("evnet:testEvent");
this.addAttrs(attris); //給Connectort添加屬性
this.set("url",_url);
}
this.structure(url);
// 屬性配置信息,此處配置了url 、data兩個屬性
var attris = {
url : {
value : "" //單屬性值
},
data : {
value : {} //對象屬性
}
};
this.accept = function() { //set屬性
this.set("data",{
protocolx:"http",
portx:"8080",
aptDatax:"123456"
}
);
this.fire("event:testEvent", {
target : this
}); //發佈事件
};
}
var p = new Connector("http://xxxx"); //實例化
p.on("event:testEvent", function(e) { //監聽事件
var obj = e.target.get("data");
//get出屬性
alert(e.target.get("data").protocolx+","+obj.aptDatax+","+e.target.get("url"));
});
p.accept(); //調用方法,觸發事件
p.set("url","再玩一下!")
alert(p.get("url"));
});