/**
* 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创建对象的模式的更多相关文章

  1. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  2. JavaScript创建对象(三)——原型模式

    在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...

  3. javascript创建对象的方法--动态原型模式

    javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题  2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...

  4. javascript创建对象的方法--组合模式

    javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...

  5. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  6. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

  7. javascript创建对象的方法--工厂模式(非常好理解)

    javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...

  8. Javascript 创建对象方法的总结

    最近看了一下<Javascript高级程序设计(第三版)>,这本书很多人都推荐,我也再次郑重推荐一下.看过之后总得总结一下吧,于是我选了这么一个主题分享给大家. 使用Javascript创 ...

  9. JavaScript创建对象

    最佳方式 原型模式与构造模式组合使用 先上代码: function Person(name,age,salary){ this.name = name; this.age = age; this.sa ...

随机推荐

  1. Linux内核中常见内存分配函数(二)

    常用内存分配函数 __get_free_pages unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) __get_f ...

  2. 关于jqueryUI里的拖拽排序

    主要参考http://jsfiddle.net/KyleMit/Geupm/2/  (这个站需要FQ才能看到效果) 其实是jqueryUI官方购物车拖拽添加例子的增强版,就是在拖拽的时候增加了排序 这 ...

  3. Android学习总结——Activity之间传递参数

    核心内容:一.在 Activity 之间传递简单数据二.在 Activity 之间传递复杂数据 三.在 Activity 之间传递自定义值对象   软件环境:Android Studio   一.在 ...

  4. iOS 四种延时的方法

    - (void)initBlock{     //延时的方法     //1:GCD延时 此方式在能够在參数中选择运行的线程. 是一种非堵塞的运行方式,没有找到取消运行的方法.     double ...

  5. DoNet开源项目-基于Amaze UI的点餐系统

    帮朋友做的点餐系统,主要是为了让顾客在餐桌上,使用微信扫描二维码,就可以直接点菜,吃完使用微信付款. 系统演示地址,账户名和密码均为:admin.(请不要删除admin用户) GitHub Clone ...

  6. 浅谈web前端就业的学习路线

    初级前端 主要学习三个部分:HTML,CSS,JavaScript 一.html + css部分: 这部分特别简单,到网上搜资料,书籍视频非常多.css中盒子模型,流动,block,inline,层叠 ...

  7. UVA 10410 Tree Reconstruction

    题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...

  8. js 正则表达式验证 整理

    1.验证首字符是英文字母: var str="123"; var reg=/^[a-zA-Z]/; if(!reg.test(str)){ alert(str+"应以字母 ...

  9. 08JS高级 ——“继承”

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. WebStorm11 注册码

    这个注册方法我也是在贴吧上看到的:http://tieba.baidu.com/p/4160766032 注册方法 注册时选择“License server”输入“http://15.idea.lan ...