JavaScript创建对象的方法汇总
JavaScript中的对象
ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特性顺序的值。对象的每一个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样(以及其他将要讨论的原因),我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以使数据或函数。
new创建对象的步骤
使用new操作符创建对象会经历的4个步骤
1.创建一个新对象;
2.将构造函数的作用域赋给新对象
3.执行构造函数中的代码
4.返回新对象
模式一
简单工厂模式:
 function createPerson(name,age,job){
   var o=new Object();
   o.name=name;
   o.age=age;
   o.job=job;
   o.sayName=function(){
     alert(this.name);
   };
   return o;
 }
优点:解决了创建多个相似对象,代码重复的问题;
缺点:没有解决对象识别的问题(即怎样知道一个对象的类型);
模式二
构造函数模式:
 function Person(name,age,job){
 this.name=name;
 this.age=age;
 this.job=job;
 this.sayName=function(){
 alert(this.name);
 };
 }
优点:可以把实例识别为一种具体的类型;
缺点:每个方法都要在每个实例上重新创建一遍;
模式三
原型模式:
 function Person(){
 }
 Person.prototype.name="Nicholas";
 Person.prototype.age=29;
 person.prototype.job="Software Engineer";
 Person.prototype.sayName=function(){
   alert(this.name);
 };
优点:可以让所有对象实例共享它所包含的属性和方法;
缺点:原型的共享本质,使所有实例共享相同属性值,对于引用类型的属性来说,改变一个实例的属性值会导致所有实例属性发生改变;
重点知识点:实例中的指针仅指向原型,与构造函数无关;
模式四
组合使用构造函数和原型模式(目前定义引用类型的一种默认模式):
 function Person(name,age,job){
   this.name=name;
   this.age=age;
   this.job=job;
   this.fridends=["Shelby","Court"];
 }
 Person.prototype={
   constructor:Person,
   sayName:function(){
     alert(this.name);
   }
 }
风格缺点:没有把所有信息封装在构造函数中,格式上没有封装性;
模式五
动态原型模式(保证了封装性):
 function Person(name,age,job){
   this.name=name;
   this.age=age;
   this.job=job;
   if(typeof this.sayName!="function"){
     Person.prototype.sayName=function(){
       alert(this.name);
     };
   }
 }
注意:使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的关系;
模式六
寄生构造函数模式:
 function Person(name,age,job){
   var o=new Object();
   o.name=name;
   o.age=age;
   o.job=job;
   o.sayName=function(){
     alert(this.name);
   };
   return o;
 }
知识点:构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时的返回值。
用处:因为原则上不应改变原生对象的原型,因此可以用此方法为已存在的对象(Array,String等)添加特殊方法
缺点:和工厂模式没有本质区别,无法用instanceof操作符确定对象类型
模式七
工厂方法模式:
相比于简单工厂,工厂方法即提供了对象的类型,又很容易创建大量对象,即每增加一个对象只需要修改一处。举例:
 var Factory=function(type,content){
   if(this instanceof Factory){
     var s=new this[type](content);
     return s;
   }else{
     return new Factory(type,content);
   }
 }
 Factory.prototype={
   Java:function(content){
     //......
   },
   JavaScript:function(content){
     //......
   }
 }
JavaScript创建对象的方法汇总的更多相关文章
- javascript创建对象的方法--原型模式
		javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ... 
- javascript创建对象的方法--基本模式
		javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ... 
- javascript创建对象的方法--动态原型模式
		javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题 2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ... 
- javascript创建对象的方法--组合模式
		javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ... 
- javascript创建对象的方法--构造函数模式
		javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ... 
- javascript创建对象的方法--工厂模式(非常好理解)
		javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ... 
- JavaScript Array 数组方法汇总
		JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ... 
- web前端教程之javascript创建对象的方法
		今天给大家讲讲javascript基础教程中的javascript面向对象的技术,这一次我们深入的学习一下JavaScrip基于t面向对象之创建对象,关于面向对象的一些术语这里就不给大家介绍了,不了解 ... 
- javascript创建对象的方法总结
		Javascript创建对象 最简单的方法:创建object实例. var person=new Object(); person.name="Joey";person.age=2 ... 
随机推荐
- Ng第十四课:降维(Dimensionality Reduction)
			14.1 动机一:数据压缩 14.2 动机二:数据可视化 14.3 主成分分析问题 14.4 主成分分析算法 14.5 选择主成分的数量 14.6 重建的压缩表示 14.7 主成分分析法 ... 
- 适配android和iOS上position:absolute和input问题
			//适配android上absolute和input的问题var oHeight = $(document).height(); //屏幕当前的高度$(window).resize(function( ... 
- Monkey and Banana (hdu 1069)
			http://acm.hdu.edu.cn/showproblem.php?pid=1069 题目描述: 给你n个箱子, 给你箱子的长宽高,箱子是可以无限使用的,问这些箱子摞起来最多能多高? 这些 ... 
- android 首字母迷糊查询 拼音查询 中英文混排查询
			对于这个问题,还没有动手去做,暂且查了查资料,把思路记录下来: 1. 数据库保存拼音+汉字.在插入数据库的时候将这些信息保存下来,将来可以进行首字母模糊查询,拼音查询,中英文混排查询(参考手机通讯录数 ... 
- uva10905同一思路的两种做法,前一种WA,后一种AC
			这道题应该算一道普通的排序吧,实际上就是另一种形式地比大小,自己最开始是用int型存,后来觉着不行,改用long,结果还是WA,这是第一个程序. 第二个程序是改用string处理,确实比int方便很多 ... 
- 设置这个属性,progress就可以变成和背景一起的了
			这个是放在Panel上的, 
- [Proposal][app]觅食去
			又要加班,午饭晚饭怎么解决?每天吃食堂换个口味可是不想出门怎么办?顿顿麦当劳,看见汉堡就想吐,下一顿吃什么? 来点个外卖吧! 可是去哪儿点呢—— 百度外卖?美团外卖?饿了么?KFC宅急送?………… 统 ... 
- 附加题:将四则运算源代码上传到Github账户上
			1.创建仓库用于存储管理本地文件 2.远程添加github上的Blog仓库. 3.获取github中Blog仓库的地址. 4.在Add Remote窗口中填写名字.Location. 5.将本地文件通 ... 
- python--求参赛两队所有可能的比赛组合情况
			朋友遇到一个面试题,让我帮忙实现,题目如下: 红队有A1,B1,C1三名队员,蓝队有A2,B2,C2三名队员,每轮比赛各队出一名队员参加,一名队员只能参加一次比赛,假设A1不会和B2打,B1不会和B2 ... 
- 在线安装WordPress更新 失败的解决办法
			1. 登录ftp登录不上 , 总是登录失败 在服务器上新建了一个vsftpd服务器,并设置了相应的虚拟用户,修改chroot到网站目录 相关连接:https://blog.csdn.net/zhan ... 
