继续默念一次,函数就是对象
在前面一文中,我写了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"));
});