JavaScript创建对象的模式
/**
* Created by W_YH on 2016/3/14.
*/ /* 对象的创建方式 */ //------->第一种创建方式------创建Object的实例 var person= new Object();
person.age=20;
person.name='milk';
person.say=function(){
console.log(this.age+this.name);
}; //------->第二种方式-----对象字面量 var person={
name:'milk',
age:20, say:function(){
console.log(this.name+this.age);
}
}; // 使用Object()构造函数和对象字面量形式创建单个对象的弊端:使用一个接口创建很多对象,会产生大量的重复代码 //------->第三种方式-----工厂模式 function creatFactor_person(name,age){
var o= new Object();
o.name=name;
o.age=age;
o.say=function(){
console.log(this.name+this.age);
};
return o;
}
var person1=creatFactor_person('milk',20); //工厂模式:不同参数会构造出不同的对象,不在单纯依赖Object实例;
// :解决了创建多个相似对象的问题,但却无法区分一个对象的类型: //------->第四种方式-----构造函数模式
function CreatConstr_person(name,age){
this.name=name;
this.age=age;
this.say=function(){
console.log(this.name+this.age);
};
}
/*调用new操作符经历的4个过程:
* 1.创建一个新对象
* 2.将构造函数的作用域赋给新对象(this指向这个新对象)
* 3.执行构造函数中的代码(为新对象添加属性)
* 4.返回新对象
* */
var person1=new CreatConstr_person('milk',20);
//使用对象的 constructor属性标识对象类型 ,也可以通过 instanceof 进行检测.使用构造函数模式可以确定对象的类型
console.log(person1 instanceof CreatConstr_person);//true
//构造函数模式优于工厂模式在于可以将构造函数模式的实例标识为一种特定的类型。
/*缺点:
*每个方法都要在每个实例上重新创建一遍,比如以上例子 创建多个对象,每个对象都具有一个say()方法且互不相同(每次都相当于调用new Function()操作),
这样实现同样任务的方法,却被创建多次,完全没有必要,不符合函数共享的本质,所以引入以下方式,将构造函数的方法放置外部
* */ function CreatConstr2_person(name,age){
this.name=name;
this.age=age;
this.say=say; }
function say(){
console.log(this.name+this.age);
}
//以上方式虽然 解决了创建两个(不同)函数解决同一个事情的问题,但却如果对象需要过多的方法,就会造成全局函数过多,且全局函数只被某个对象调用,似乎有些浪费 var person=new CreatConstr2_person('milk',20); //------->第五种方式-----原型模式 function CreatConstr3_person(){} CreatConstr3_person.prototype.name='milk';
CreatConstr3_person.prototype.age=20;
CreatConstr3_person.prototype.say=function(){
console.log(this.name+this.age);
} var person=new CreatConstr3_person();
//原型对象,解决了通过构造函数完成同一功能方法反复创建且创建的不同实例对象的方法不同的问题(两个(不同)函数解决同一个事情的问题); //简化操作,原型对象字面量形式 function CreatConstructor4_person(){} CreatConstructor4_person.prototype={
name:'milk',
age:20,
say:function(){
console.log(this.name+this.age);
}
}; var person=new CreatConstructor4_person(); //这时会出现原型对象的constructor指向的问题(相当于重写原型,默认指向Object()),可显式指定其指向;参见高程P155。
//原型模式的缺点:1.原型模式省略了为构造函数传参的步骤,所以创建出的所有实例,均具有相同的属性和方法----工厂模式和构造函数模式由于传参不存在该问题
//原型模式另一个缺点是:由原型模式共享本质所引起的(共享对于函数来说是极好的,基本类型属性也可通过实例覆盖,但对于引用类型就比较麻烦)
//共享导致所有实例都可以访问别的实例所添加 的引用类型属性,大家都具有一样的属性,无隐私可言 //------->第六种方式-----组合使用构造函数和原型模式
//构造函数用于定义实例属性,原型模式定义方法和共享的属性。 function CreatConstructor5_person(age,name){
this.name=name;
this.age=age;
this.friends=[];
}
CreatConstructor5_person.prototype={
constructor:CreatConstructor5_person,
say:function(){
console.log(this.name+this.age+this.friends);
}
} var person1=new CreatConstructor5_person(20,'milk');
person1.friends.push('AS'); //------->第七种方式-----动态原型模式
// 把所有的信息封装在构造函数中,(仅在需要时创建)在构造函数中初始化原型,又同时保持使用构造函数和原型的优点 function CreatConstructor6_person(name,age){
this.name=name;
this.age=age;
if(typeof(this.say)!="function"){
CreatConstructor6_person.prototype.say=function (){
console.log(this.name+this.age);
}
}
}
var person1= new CreatConstructor6_person('milk',20); //寄生构造函数模式:和工厂模式一样,但创建实例时,需要使用new操作符;
//稳妥构造函数模式:没有公共属性,且方法也不引用this对象;与寄生模式不同点:实例方法不引用this,不使用new调用构造函数
//导致外部无法访问内部数据 function person(name,age){
var o=new Object(); o.say=function (){
console.log(name);
}
}
JavaScript创建对象的模式的更多相关文章
- javascript 创建对象的7种模式
使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...
- JavaScript创建对象(三)——原型模式
在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...
- javascript创建对象的方法--动态原型模式
javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题 2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...
- javascript创建对象的方法--组合模式
javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...
- javascript创建对象的方法--原型模式
javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
- javascript创建对象的方法--工厂模式(非常好理解)
javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...
- Javascript 创建对象方法的总结
最近看了一下<Javascript高级程序设计(第三版)>,这本书很多人都推荐,我也再次郑重推荐一下.看过之后总得总结一下吧,于是我选了这么一个主题分享给大家. 使用Javascript创 ...
- JavaScript创建对象
最佳方式 原型模式与构造模式组合使用 先上代码: function Person(name,age,salary){ this.name = name; this.age = age; this.sa ...
随机推荐
- LInux 下挂在Windows共享文件夹
挂载WIndow共享文件夹 //192.168.0.103/software mount -t smbfs -o username=administrator,password=“de123” / ...
- UML_交互图
交互图(Interaction Diagram)用来描述系统中的对象是如何进行相互作用的.即一组对象是如何进行消息传递的. 当交互图建模时,通常既包括对象(每个对象都扮演某一特定的角色),又包括消息( ...
- hdu 1242 Rescue_bfs+优先队列
翻出以前的代码看看 题意:走迷宫,遇到敌人要花一分钟. #include<iostream> #include<queue> using namespace std; char ...
- 一道来自华为的C机试题目
题目是这样的 求一个字符串中连续字母的个数 比如I have a book. : 1 I have a dog. : 0 I haavee aa dogg : 4 #include <windo ...
- 注意使用 BTREE 复合索引各字段的 ASC/DESC 以优化 order by 查询效率
tbl_direct_pos_201506 表有 190 万数据.DDL: CREATE TABLE `tbl_direct_pos_201506` ( `acq_ins_code` char(13) ...
- linux中grep使用方法具体解释
查找特定字符串并颜色显示 [root@fwq test]# grep -n 'the' regular_express.txt --color=auto 8:I can't finish the te ...
- 开源 java CMS - FreeCMS2.3 移动app生成首页数据
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/28160.html 项目地址:http://www.freeteam.cn/ 生成首页数据 ...
- 百度地图 Android SDK - Hello Baidu Map
例如,给广大以下主要开发者介绍了如何使用百度地图Android SDK构造的主应用程序的地图! 第一步.创建Androidproject,将百度地图Android SDK的开发包导入到project对 ...
- 绿色mysql启动脚本
启动脚本如下:./mysqld_safe --defaults-file=/export/servers/mysql-5.5.38/my.cnf --ledir=/export/servers/mys ...
- sql必知必会(第四版) 学习笔记一
温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记.... 1 去重复关键词,distinct select distinct sname from student; 2 限制结果top的用 ...