1. 程式人生 > >JavaScript-創建第一個自己的類庫

JavaScript-創建第一個自己的類庫

spa 內部 man efi i++ ont 基礎上 ner dev

通過上一節面向對象和原型的學習。

我們知道了怎樣創建一個類,包含類的私有化屬性和方法、公有化屬性和方法、靜態屬性和方法。在這裏略微回想一下。首先要創建一個類能夠通過1.new object()。2.利用構造函數function Person(){},然後通過new Person()。另一種是通過字面量的方式創建一個對象,通過字面量的方式不能使用new運算符,由於他是在內部自己new object()。

在這裏我們要對類和對象有一定的區分,形象的來說,假設動物是一個類的話。人能夠是當中一個對象。就上面的var person = new Person();這裏的Person就是一個類。而person則是他的一個實例化對象,並且能夠有非常多派生的類,比方Man.prototype = new Person(); var man = new Man();那麽這個man也是一個實例化對象。簡單的說,類是虛的,而對象是實體的。了解了對象和類的差別之後。我們簡單看下怎樣創建類的私有化。公有化以及靜態屬性和方法。

面向對象的知識

var a = function(){
     var private1 = ‘private1‘;               //私有字段
     this.public1 = ‘public1‘;               //共同擁有字段,實例字段
     var privateMethod1 = function(){     //私有方法
          alert(‘privateMethod1‘);
     }
     this.publicMethod1 = function(obj){     //公共方法。實例方法
          private1 = obj;
     }
     this.publicMethod2 = function(){     //公共方法
          return private1;
     }
}
a.filed1 = ‘filed1‘;                         //公共靜態字段
var b1 = new a();
var b2 = new a();
b1.publicMethod1(‘ss‘);
console.log(b1.publicMethod2());
console.log(b2.publicMethod2());

****************************************************

var a = (function(){
     //console.log(this);                                   //window對象
     var private1 = ‘private1‘;                              //這個是私有靜態屬性
     this.public1 = ‘public1‘;
     return function(){
          //console.log(this);                              //object對象
          this.publicMethod1 = function(obj){
               private1 = obj;    
          }
          this.publicMethod2 = function(){
               //console.log(this);                         //返回的對象的實例
               return private1;
          }
     }    
})();

var b1 = new a();
var b2 = new a();
b1.publicMethod1(‘s‘);
console.log(b1.publicMethod2());
console.log(b2.publicMethod2());

第一個類庫base.js

了解了主要的面向對象和原型後。我們來封裝我們第一個類庫。

這個類有下面功能:能夠通過id,class,tagname獲取元素,實現連綴功能,設置css,獲取文本等主要的功能:

var $ = function(){
	return new Base();	
}

var Base = function(){
	this.elements = [];		//代表元素集合
}

//利用Id獲取元素
Base.prototype.fId = function(id){
	this.elements.push(document.getElementById(id));
	return this;
}

//利用tagName獲取元素
Base.prototype.fTag = function(tag){
	var eles = document.getElementsByTagName(tag);
	for(var i = 0,len = eles.length; i < len; i++){
		this.elements.push(eles[i]);
	}
	return this;
};

//利用className獲取元素
Base.prototype.fClass = function(className){
	var eles = document.getElementsByClassName(className);
	for(var i = 0,len = eles.length; i < len; i++){
		this.elements.push(eles[i]);
	}
	return this;
};

//文本值
Base.prototype.fText = function(str){
	var texts = [];
	//獲取innerHTML的值
	function getInnerHTML(i,that){
		texts.push(that.elements[i].innerHTML);
	};
	//設置innerHTML的值
	function setInnerHTML(i,that,str){
		that.elements[i].innerHTML = str;
	};
	//獲取nodeValue的值
	function getNodeValue(i,that){
		texts.push(that.elements[i].firstChild.nodeValue);
	};
	//設置nodeValue的值
	function setNodeValue(i,that,str){
		that.elements[i].firstChild.nodeValue = str;
	};
	if(arguments.length === 0){
		typeof this.elements[0].innerHTML != "undefined"?lenFor(getInnerHTML,this):lenFor(getNodeValue,this);
		return texts;
	}else if(arguments.length === 1){
		typeof this.elements[0].innerHTML != "undefined"?lenFor(setInnerHTML,this,str):lenFor(setNodeValue,this,str);
		return this;
	}
};
/*
if(arguments.length === 0){					//假設不輸入參數則覺得是獲取文本值
	if(typeof this.elements[0].innerHTML != "undefined"){
		var getInnerHTML = function(){
			texts.push(this.elements[i].innerHTML);
		}
	}else{
		for(var i = 0,len = this.elements.length; i < len; i++){
			texts.push(this.elements[i].firstChild.nodeValue);
		}
	}
	return texts;
}else if(arguments.length === 1){			//假設輸入參數則覺得是設置文本值
	if(typeof this.elements[0].innerHTML != "undefined"){
		for(var i = 0,len = this.elements.length; i < len; i++){
			this.elements[i].innerHTML = str;
		}
	}else{
		for(var i = 0,len = this.elements.length; i < len; i++){
			this.elements[i].firstChild.nodeValue = str;
		}
	}
	return this;
}
*/

//設置和獲取CSS值
Base.prototype.fCss = function(cssName,cssValue){
	var cssStrs = [];
	//獲取getComputedStyle的值
	function getFFStyle(i,that,cssName){
		var style = window.getComputedStyle(that.elements[i]);
		cssStrs.push(style[cssName]);
	};
	//獲取currentStyle的值
	function getIEStyle(i,that,cssName){
		var style = that.elements[i].currentStyle;
		cssStrs.push(style[cssName]);
	};
	//設置css的值,當中float為保留字,IE為styleFloat,FF為cssFloat
	function setCss(i,that,cssName,cssValue){
		that.elements[i].style[cssName] = cssValue;
	};
	if(arguments.length === 1){
		typeof window.getComputedStyle != "undefined"?

lenFor(getFFStyle,this,cssName):lenFor(getIEStyle,this,cssName); return cssStrs; }else if(arguments.length === 2){ //設置CSS的值 lenFor(setCss,this,cssName,cssValue); return this; } }; //加入css類選擇器 Base.prototype.addCssClass = function(className){ //獲取elements的class值 function add(i,that,className){ var name = that.elements[i].className; var partern = new RegExp("(^|\\s)" + className + "($|\\s)","g"); if(!partern.test(name)){ name += " " +className; } that.elements[i].className = name; }; lenFor(add,this,className); return this; }; //刪除css類選擇器 Base.prototype.removeCssClass = function(className){ //刪除elements的class值 function remove(i,that,className){ var name = that.elements[i].className; var partern = new RegExp("(^|\\s)" + className + "($|\\s)","g"); that.elements[i].className = name.replace(partern,""); }; lenFor(remove,this,className); return this; }; //對elements進行循環,並運行fn函數 function lenFor(fn,that,str,str1){ for(var i = 0,len = that.elements.length; i < len; i++){ fn(i,that,str,str1); } };

這是第一個類庫的雛形,還沒有進行優化。待日後學習後進行優化。其它的類庫將在這個基本庫的基礎上進行拓展。以添加其功能。

JavaScript-創建第一個自己的類庫