一、JavaScript创建类的三种方法####
1、工厂方式
function createPeople(name,sex){
var obj=new Object();
obj.name=name;
obj.sex=sex;
obj.showname=function(){
alert("我的名字是:"+this.name);
}
obj.showsex=function(){
alert("我是"+this.sex+"的");
}
return obj;
}
var p1=createPeople("hope","man"); //创建实例(对象)
2、构造函数
function People(name,sex){
this.name=name;
this.sex=sex;
}
People.prototype.showName=function(){
alert(this.name);
}
People.prototype.showSex=function(){
alert(this.sex);
}
var p1=new People("hope","man");
3、利用继承
function Person(name,sex){
this.name=name;
this.sex=sex;
}
Person.prototype.showname=function(){
alert(this.name)
}
Person.prototype.showsex=function(){
alert(this.sex);
}
function Worker(name,sex,job){
Person.call(this,name,sex); //函数伪装
this.job=job;
}
Worker.prototype=Person.prototype; //继承
二、工厂方式
工厂方式对于JavaScript这种函数式编程语言来说,应该是最容易理解的,但是需要注意的是此时创建的实例(对象)的方法和属性并不一样,
var p1= new createPeople("blue","man");
var p2=new createPeople("red","man");
alert(p1.showname==p2.showname);
此时,弹出的警告框为false,也就是说,两个对象的方法和属性并不是同一个方法和属性,当我们需要大量创建实例(对象)的时候,这就会造成资源的大量浪费,这当然不是我们希望的。
三、构造函数
利用构造函数我们可以发现,这可以有效地解决工厂方式造成的资源浪费的问题,所有创建出来的对象拥有相同的方法和属性,只是属性的值不同而已。以下代码将弹出值为true的警告框,即使将等于号改为严格等于===,值也依旧为true。
var p1=new createPeople("hhhh","男");
var p2=new createPeople("aaaa","女");
p1.showName();
p1.showSex();
p2.showName();
p2.showSex();
alert(p1.showName==p2.showName);
四、利用继承
接下来我们来分析prototype方法,应该说这是JavaScript中继承的实现,但是需要注意的是上文中的Worker.prototype=Person.prototype;这行代码,这行代码将父类的方法继承给了子类,但是如果我们执行以下代码:
Person.prototype.showname=function(){
alert(this.name)
}
Person.prototype.showsex=function(){
alert(this.sex);
}
function Worker(name,sex,job){
Person.call(this,name,sex); //函数伪装
this.job=job;
}
Worker.prototype=Person.prototype;
Worker.prototype.showjob=function(){
alert(this.job);
}
alert(Person.showjob===Worker.showjob);
这将会弹出一个true的警告框,也就是说父类和子类拥有了相同的方法,或者说子类影响了父类,这当然不是我们想要的,那到底是为什么呢?
先来看一个简单的例子吧;
var arr1=[1,2,3];
var arr2=arr1;
arr2.shift();
alert("first:"+arr1);
alert("second:"+arr2);
alert(arr1===arr2);
在这个简单的例子中,我利用了JavaScript中的内置类Array创建了一个对象arr1,接着将arr1的所有值复制了一份到arr2中,利用Array的方法shift删去了arr2的第一个值1,但是以下三个警告框分别得到的值是:“first:2,3”,“second:2,3”,“true”,这说明了什么?说明了arr1和arr2其实是一个对象。也就是说arr1和arr2的内存地址其实是同一个地址,这有点类似于引用,这显然是为了JavaScript的性能考虑。其实就像是有一间房子,arr1有一把钥匙,arr2拿着arr1的钥匙去配了一把钥匙,当arr2改变房子里的任何东西的时候,对arr1来说,房子也发生了改变。同样的道理,当我们创建一个类的时候,通过继承也会面临相同的问题。当然解决这个问题也很简单,我们只需要对arr2的元素逐一赋值即可,如下:
for(var i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
同样,对于自己创建的类来说,利用for...in即可解决上面的问题:
for(var i in Person.prototype){
Worker.prototype[i]=Person.prototype[i];
}
网友评论