工厂模式
1、跟现实中的工厂差不多
2、在函数内部创建了一个新的空对象,最后返回这个对象
3、缺点:虽然new的是共同的一个函数,但是其中的方法做对比,返回false,也就意思说,new的函数中的方法,不是共享(不是同一个地址).
1 //现实中的工厂===>生产一瓶西瓜汁 2 //1》西瓜 ??====>new Object(); 3 //2》榨汁 ??====>对象的属性 4 //3》装瓶,贴商标.... ?====>对象的方法 5 //4》大货车拉出厂子卖 6 ?7 function createObject(){ 8 ?9 ????var obj = new Object();10 ????obj.name = "西瓜汁"; //属性11 ????obj.run = function(){//方法12 13 ????????return "贴了商标了";14 ????};15 16 ????return obj;//出厂==》卖17 }18 19 var o1 = new createObject();20 var o2 = new createObject();21 22 /*console.log(o1.name);23 console.log(o2.name);*/24 /*console.log(o1.run == o2.run);*/
构造函数模式
和工厂模式区别:
1、 构造函数中,不需要在内部创建对象(给这个对象添加属性,方法,也不用return 对象)
2、如果要写构造函数模式,函数的首字母需要大写,像下面这些js的内置对象本质上都是构造函数实例化。
new Array()
new String()
new Date()
new RegExp();
3、缺点:虽然new的是共同的一个函数,但是其中的方法做对比,返回false,也就意思说,new的函数中的方法,不是共享(不是同一个地址).
1 function CreateFn(){ ?//首字母要大写 2 ?3 ????this.str = "构造函数"; 4 ????this.run = function(){ 5 ?6 ????????return "js构造函数方法"; 7 ?8 ????} 9 }10 //1>其实构造函数就是普通函数,只不过首字母需要大写了,为了让别人知道,这个函数是一个构造函数11 //2>函数内部写变量不在是var str ===> this.str;12 13 14 var obj1= new CreateFn();15 var obj2= new CreateFn();16 17 /*console.log(obj1.str);18 console.log(obj2.str);*/19 20 console.log(obj1.run == obj2.run);
原型模式
1、每当创建一个函数,都有一个prototype(原型)的属性
2、原型(prototype)这个属性的指针,指向于一个对象,而这个对象的用途可以由特定类型的所有实例“共享”的方法和属性.
3、原型(prototype)是共享所有的属性和方法,也就是,如果new了2个函数(实例化),他们的方法是共享的,做对比,返回true,共同使用一个地址
4、缺点 :因为是共享的方法,公用一个地址,如果后期一个修改,所有对象的方法就都修改了
1 function fn(){ 2 ?3 ????fn.prototype.userName = "张三"; 4 ????fn.prototype.arr = [1,2,3]; 5 ????//把fn的原型的属性(userName)共享给对象了 6 ????fn.prototype.run = function(){ 7 ?8 ????????return "这是一个共享的方法"; 9 ????}10 11 }12 13 var obj1 = new fn();14 var obj2 = new fn();15 16 /*17 console.log(obj1.userName);18 console.log(obj2.userName);*/19 //console.log(obj1.run == obj2.run);20 21 /*22 obj1.userName = "李四";23 console.log(obj1.userName);24 console.log(obj2.userName);25 */26 27 obj1.arr[1] = "你好数组";28 console.log(obj1.arr);29 console.log(obj2.arr);
组合模式:构造函数和原型模式
1、构造函数:定义实例属性
2、原型:定义和共享属性
优点:每一个实例都会有自己的一份实例属性,但又同时共享着方法
1 function CreateFn(){ 2 ?3 ????this.userName = "张三"; 4 ????this.age = 18; 5 ????this.arr = [1,2,3]; 6 ?7 }; 8 ?9 CreateFn.prototype.run = function(){10 11 ????return "我是共享的";12 13 };14 15 var obj1 = new CreateFn();16 var obj2 = new CreateFn();17 18 19 console.log(obj1.run == obj2.run);20 21 22 obj1.arr[1] = "李四";23 console.log(obj1.arr);24 console.log(obj2.arr);
动态原型模式
是将所有的信息(属性和方法)都封装在构造函数中,而通过构造函数来初始化原型
解决:第一个对象实例化的时候就初始化原型,后面的就不需要初始化
1 function CreateFn(){ 2 ?3 ????this.userName = "张三"; 4 ?5 ????if( typeof this.run !="function" ){ 6 ????????console.log(1); 7 ????????alert(1); 8 ????????CreateFn.prototype.run = function(){ 9 10 ????????????return "共享的run方法";11 12 ????????}13 ????}14 }15 16 var obj1 = new CreateFn();17 var obj2 = new CreateFn();
js面向对象
原文地址:https://www.cnblogs.com/hsgg/p/8256798.html