javascript中的对象和传统意义上的对象有所不同,前者包含的没有类的概念,因此这里的面向对象编程(oop)也就不一样了
创建对象:一般常用的是字面量的方法和构造函数的方法,但是这样有一个缺点就是一个接口可以创建很多个对象,这就造成了代码的冗余为了解决这个问题--
工厂模式
工厂模式说白了就是通过封装一个函数来创建对象(return出对象),但是这样做的缺点很明显就是不知道对象的类型。
构造函数模式
调用构造函数实际上会经历以下 4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。
每一个构造函数的实例都会有一个constructor属性,指向构造函数对象本身,而在构造函数的内部,this指向的是实例本身;其实千万不要把构造函数看的太神秘,其实构造函数也是函数,也可以当作普通的函数来调用,只不过调用时此时的this指向了window对象;
以下面的例子为例:
function Person(name,age,height,address){
this.name = name;
this.age = age,
this.height = height;
this.address = address;
this.fun = function(){
alert(this.age)
}
其实上面的函数就相当于这样子,因为毕竟函数也是对象。
function Person(name,age,height,address){
this.name = name;
this.age = age,
this.height = height;
this.address = address;
this.fun = new Function("alert(this.age)")
//只有在调用的时候才会执行,这时这个this指向的是new出来的实例
}
这样就一眼能看
出构造函数的缺陷,其实每个构造函数的实例都会包含不同的Function实例,虽然函数名字fun一样但是他们确实不同的,因为构造函数一旦实例化以后,里面的属性就只属于他自己,这就造
成了重复定义相同功能的函数
那么到底有没有解决这种问题的办法呢,答案是有的,我们可以在全局作用域定义一个函数然后绑定到属性上例如这样子:
因为fun1一个函数,也是一个对象,是引用类型,所以this.fun其实包含的是fun1的指针,都指向了全局定义的函数。也就解决了以上的问题,但是万一的一项里面要定义很多个方法,那就需要定义很多个全局函数了,这样何谈封装呢?function Person(name,age,height,address){ this.name = name; this.age = age, this.height = height; this.address = address; this.fun = fun1 } function fun1(){ alert(this.age) }
解决办法就是:原型模式