JavaScript中对象的构造模式(类的模仿)

2016-09-30  本文已影响0人  没个性的七秒鱼

为什么叫类的模仿,因为JS中没有类的概念,也就是没有class这个东东,毕竟是为了赶时髦才加上java这个词的,跟java可是一点关系没有,也没有java中典型的class的概念,但是作为一门强大的脚本语言如何去面向对象呢,那就是利用构造函数模仿类的功能

1、工厂模式创建对象

这是最原始的创建对象的方法,原理也很简单,就是封装了一个返回值为对象的函数

function createObject(name,age){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sayName = function(){
        alert(this.name);
    }
    return o;
}
var person1 = createObject('小明','18');
person1.sayName();
var person2 = createObject('小红','17');
person2.sayName();

这样就能通过函数createObject不断的创建对象了,但是,我们想模仿的是类的概念,但是这里所创建的每一个对象都没有办法识别是什么类型,看下面代码:

alert(person1 instanceof Object); //true
alert(person2 instanceof Object); //true

这里创建出来的变量person1和person2都是Object类型的,并不符合面向对象里面的'分类'的概念,比如我想让创建出来的对象都属于一个范畴的,就拿这里的person1和person2来说,这两个对象应该都属于人的范围,应该有一个代表人的类型来专门给他们分类,为了解决这个问题,就有了第二种方法:

2、构造函数创建对象

通过一个构造函数来创建对象

function person(name,age){
    this.name = name;
    this.age = age;
    this.sayName = function(){
        alert(this.name);
    }
}
person1 = new person('小明',18);
person2 = new person('小红',17);
person1.sayName();   //小明
person2.sayName();   //小红

这种方法很好的解决了对象识别的问题,如下代码:

alert(person1 instanceof Object); //true
alert(person1 instanceof person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof person); //true

会发现person1和person2不仅是object类型的实例,还都是person类型的实例
构造函数方法创建对象能够满足最基本“类的模仿”,但严格来说还有很多问题,比如这里用构造函数每创建一个对象就要单独开辟一块内存空间,但实际上对象里的很多属性常常是可以共用的,比如说这里的sayName方法,每个对象里都有这个方法,为什么不在内存空间里只开辟一块地方存它,然后让所有对象都从这块地方调用它呢,为了实现这个原理,就有了原型的使用。

3、JS中的原型

未完待续~

上一篇 下一篇

猜你喜欢

热点阅读