为什么叫类的模仿,因为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中的原型
未完待续~