YUI, JavaScript 構造函數的再次思考

繼續默唸一次,函數就是對象

 

在前面一文中,我寫了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"));
		

	});


 

 

 

發佈了52 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章