用JavaScript创建类

作者: 忽如寄 | 来源:发表于2016-03-12 22:24 被阅读111次

一、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];
}

相关文章

  • 用JavaScript创建类

    一、JavaScript创建类的三种方法#### 1、工厂方式 2、构造函数 3、利用继承 二、工厂方式工厂方式对...

  • JavaScript面向对象

    创建默认对象 JavaScript中提供了一个默认的类Object,我们可以通过这个类创建对象 由于是用系统默认的...

  • javascript --创建类

    在开始这篇文章的主题之前,我先把之前对匿名函数的了解整理一下。 创建一个Object 我只前接触的创建一个对象都是...

  • JavaScript 类

    JavaScript 是面向对象的语言,但 JavaScript 不使用类。在 JavaScript 中,不会创建...

  • JavaScript-9面向对象

    JavaScript对象 JavaScript中提供了一个默认的类Object, 我们可以通过这个类来创建对象 由...

  • 08-JavaScript面向对象

    创建对象 JavaScript中如何创建对象 通过默认的Object这个类(构造函数)来创建 通过字面量来创建对象...

  • 13 初识类——创建类与用类创建实例

    顾名思义,类就是某一类事物。 男生和女生是很大的类;东海县男生、东海县女生也是两个类。 * 本文例子是简单的一种类...

  • javascript中的面向对象编程笔记

    创建object对象 在javascript中,创建object的方法有几种,可以直接用“{}”创建 也可以利用构...

  • 理解 javascript prototype

    javascript prototype 原型法的主要思想是,现在有个类A,想要创建一个类B,这个类是以A为原型的...

  • Python:类

    创建和使用类 创建Dog类 用class关键字创建类,类名后的()中填写的是要继承的类。 __init__()方法...

网友评论

    本文标题:用JavaScript创建类

    本文链接:https://www.haomeiwen.com/subject/yvpxlttx.html