js面向对象的几种方式----工厂模式、构造函数模式、原型模式
对象的字面量
1 var obj={}
创建实例对象
1 var obj=new Object()
工厂模式
1 function cPerson(name,sex,age){ 2 var o = new Object(); 3 o.name = name; 4 o.sex = sex; 5 o.age = age; 6 o.show = function(){ 7 console.log(this.name,this.age,this.sex); 8 } 9 return o; 10 } 11 var p1 = cPerson('谦龙','男','100'); 12 p1.show(); 13 var p2 = cPerson('雏田','女','14'); 14 p2.show();
工厂模式测试
工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型)
构造函数模式
function CPerson(name,sex,age) {//注意这里 构造函数首字母大写 this.name = name; this.sex = sex; this.age = age; this.show = function () { console.log(this.name, this.age, this.sex); } } var p1 = new CPerson('谦龙','男','100'); p1.show(); var p2 = new CPerson('雏田','女','14'); p2.show();
构造函数模式测试
注意构造函数与工厂模式有些不同的地方,如下
构造函数首字母大写
没有显式地创建对象
将属性和方法赋值给了 this 对象
没有return语句
而且以这种方式来调用构造函数会大致经历一下 几个步骤
创建一个新的对象
将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)
执行构造函数中的代码(即给新对象添加属性和方法的过程)
返回对象
注意:构造函数其实和普通的函数没有太大的差别,唯一的不同在于调用方式的不同。以下演示不同的几种调用方式
1 // 调用方式1 new 方式 2 var p1 = new CPerson('谦龙','男','100'); 3 p1.show();//谦龙 100 男 4 // 调用方式2 普通函数调用 5 CPerson('谦龙','男','100'); 6 window.show()//谦龙 100 男 注意属性和方法会被设置到window对象上 7 // 调用方式3 在另一个对象的作用域中调用 8 var obj = new Object(); 9 CPerson.call(obj,'谦龙','男','100'); 10 obj.show(); //谦龙 100 男 在obj的作用域
构造函数的问题:使用构造函数最主要的问题就是每个方法都要在每个实例上重新创建一次,p1与p2的都有show方法,但不是同一个Function的实例,因为function在js中也是一个对象。因此他们共有的show方法并不相等。
原型模式
每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。而这个对象的用途是 包含可以由 特定类型 的所有 实例 共享的属性和方法。即调用构造函数所创建的那个对象的 原型对象
好处是可以让所有对象的实例共享他的属性的方法。即无需在构造函数中定义实例的信息
1 function CPerson(){ 2 } 3 CPerson.prototype.name='谦龙'; 4 CPerson.prototype.sex='男'; 5 CPerson.prototype.age=100; 6 CPerson.prototype.show=function(){ 7 console.log(this.name, this.age, this.sex); 8 } 9 var p1 = new CPerson(); 10 p1.show(); //谦龙 100 男 11 var p2 = new CPerson(); 12 p2.show();//谦龙 100 男 13 console.log(p1.show == p2.show)//true