/**
* 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. yum lamp for Centos6.4

    1,Centos6.4  yum lamp#!/bin/sh<<cat#echo Ruiy!#Create by Ruiy on 2015-03-27----cat yum install ...

  2. OpenStack high-level Functionsenabled

  3. Hadoop 4、Hadoop MapReduce的工作原理

    一.MapReduce的概念 MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框就是mapreduce,两者缺一不可,也就是 ...

  4. UVA 10131 Is Bigger Smarter?(DP)

    Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to t ...

  5. Oozie入门

    作者 Boris Lublinsky, Michael Segel ,译者 侯伯薇 发布于 2011年8月18日 |注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情! 分 ...

  6. 基于Mesos运行Spark

    背景介绍 Spark有多种集群运行模式,例如:Standalone,Yarn,Mesos.      下面就说一下如何在Mesos上运行Spark,这也是官方推荐的一种运行方式.      在运行Sp ...

  7. 读书笔记一 Java程序员的基本修养(数组及其内存管理)

    1.1 数组初始化 1.1.1 java数组是静态的 java数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的. java程序中的数组必须经过初始化才可使用. 数组的初始化有两种方式: 1 ...

  8. Python Challenge

    0. 2的38次方 print 2**38 ##apply the result to the url 1. 看图是要right shift两位, 切片即可. import string intab ...

  9. Oracle中字段的修改操作语法

      对字段操作 操作方法 更新字段名 alter table TABLE_NAME rename column column_old to column_new; 添加字段 alter table T ...

  10. Android之 compileSdkVersion, minSdkVersion, and targetSdkVersion

    在一年之中,也有可能只是几个月后,你会发布你的Android应用程序.但是这中间有可能会发布新的版本的Android系统,比如:6.0+. 你肯定希望你的应用可以向前兼容,当用户升级到新的Androi ...