1、JS的封装
对象实例化
var obj=new Object();
对象类型:本地类Object Array Function String 。。RegExp(正则表达式),具体的类参见说明
关键字this
在ECMAScript中,要掌握的最重要的概念之一是关键字this的用法.
它用在对象的方法中,关键字this总是指向调用该方法的对象:
eg:
var oCar = new Object();
oCar.color=“red”;
oCar.showColor=function(){
alert(this.color); //等价于 oCar.color
}
从第一种方法到第四种方法是课程中一步步灌输基础知识,和每种方法的优缺点,真正实用的值第五种(构造函数+原型法),作为实际应用可是直接学习第五种,其他方法可以忽略。
工厂模式:基本模式,但这种方法每次创建都要生成一个默认属性的实例,然后再使用属性赋值,这样代码量较大
1、基础方法
function CreateCar ( ) { var oCar=new Objiect(); oCar.color="red" oCar.showColor=function (){ alert(this.color) } return oCar; }
调用:
var oCar1=CreateCar();var oCar2=CreateCar();oCar1.showColor(); //------->red oCar2.color="blue";ocar2.showColor();//-------->blue改进使用带参的构造函数,实例化时就直接生成相应的属性
2、带参数
function CreatCar(color,door){ this.color=null; this.Door=null; this.showColor=function ( ){ alert(this.Color) } }
使用:
var car1=CreateCar(“red”,4) alert(car1.Color);//--->red car1.showColor();//------>red
3、将方法外移,通过this特性减少地址空间使用
以上方法中,将showColor方法写到了类的内部,将增加内存开销。可将方法提出来,通过this特性公用地址空间,从而减少地址开销----//不是很理解,但是知道这样写会减少内存地址的使用
4、方法3,如果方法很多,类很多,都提取出来讲很不容易维护,需要进一步改进function showColor() { alert(this.color) } function CreateCar( color) { var oCar=new Object(); oCar.color=color; oCar.showColor=showColor; return oCar; }
原型链方式:存在致命缺陷,如果“red”不是字符串,数值等简单类型,而是另一个类,对象,数组等复杂类型,则公用同一块内存地址空间,必会造成,car1如果改变,car2也会跟着改变。
function Car(){ }; Car.prototype.color="red" Car.prototype.doors=4; Car.prototype.showColor=funtion(){ alert(this.color); } //调用 var car1=new Car(); car1.color="blue"; car1.showColor();
添加一个属性:Car.prototype.drivers=new Array("a","b")//数组类型调用:car1.drives.push(“c”)
alert(car1.drivers);-----》a,b,c
如果存在car2时,car2.drivers;----》a,b,c
5、原型+构造函数结构(属性用构造函数方法、方法用原型方法)
function Car (Color,Doors){ this.color=Color; this.doors=Doors; this.drivers=new Array(); } Car.prototype.ShowColor=function(){ alert(this.color); }
面向对象的封装具体使用(JS可以封装、扩展、重写原有方法和属性,可以完成适合自己或更加便捷,功能更复杂的功能)
1、字符串的不变性
JS和Java一样具有字符串的不变性,因此如果出现字符串的操作时就会大量消耗内存。因此通过自定义JS方法将字符串造作进行封装。就是将字符穿放到数组中然后ToString
funtion StringBuffer(){ this._string_=new Array(); } StringBuffer.prototype.append=function(str){ this._string_.push(str); } StringBuffer.prototype.toString=funtion(){ teturn this._strings_.join(""); }
此方法是一个属性(数组),2个方法,一个是向数组中添加内容,一个是将数组转变成字符串。调用
var sb=new StringBuffer(); sb.append("a"); sb.append("b"); alter(sb.toSting());//--------->ab
2、数值的进制转换Number.prototype.toHexString=function(); { return this.toSring(16); }
调用
var iNum=10; alert(iNum.toHexString());//--->a
3、Objec.prototype.alert=funtion(){alert(this.valueOf())
}//因为所有类都是从Object继承而来,因此定义了Object的alert方法后 所有的类都有alert()方法了,不管是数字型num还是字符串num
调用: var num=25; var str="abcdefg" ; str.alert(); num.alert();
通过以上例子可以看出,许多系统自带的弄能通过封装可以从能到调用适合自己的需求和习惯,也可以使功能更加强大。
d