工厂模式

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;
} var person1 = createPerson("tom",20,"trtr");
var person2 = createPerson("tom1",24,"httt");

优点:使用同一个接口创建很多独享,避免大量的重复代码。

缺点:没有解决对象识别问题,怎样知道一个对象的类型。

构造函数模式

构造函数就是为了解决工厂模式的缺点,将它的实例标识为一种特定类型。

缺点:每个方法都要在每个实例撒很重新创建一遍。

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name)
}
} var person1 = new Person("gr",12,"Grgr");
var person2 = new Person("gr44",45,"4y4");

原型模式

每个函数都有一个prototype的原型属性,是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

优点:让所有对象实例共享它所包含的属性和方法。将这些信息直接添加到原型对象中。

function Person(){

}
Person.prototype.name = "tom";
Person.prototype.age = 29;
Person.prototype.jobn = "ghrrh";
var person = new Person();

原型模式下的一个坑

function Person(){

}
Person.prototype.name = "tom";
Person.prototype.age = 29;
Person.prototype.job = "ghrrh"; //有些时候为了图方面会将其写成下面这样
Person.prototype = {
name: "tom",
age: 29,
job: "ghrrh"
}
//但是这时候无意间就重写了默认的prototype对象,因此constructor属性变成了新对象的constructor属性(指向Object构造函数),不再指向Person函数
var person = new Person();

对了这里还要介绍一个原型对象:

无论什么时候,创建一个新函数,就会根据一组特定的规则创建一个prototype属性,这个属性会指向prototype对象。在默认情况下,所有原型对象都会获得一个constructor属性,这个属性包含一个指向prototype属性所在函数的指针。

缺点:

实际上,很少的人会单独使用原型模式,因为原型模式是让所有对象实例都共享一个原型对象上的属性和方法。

对于基本类型还可以,可以在实例中定义,然后覆盖原型中的,但是对于引用类型,修改一个实例上(person1)的一个引用类型的属性,就会引起另一个实例(person2)的引用类型的改变,其实我们要的不是这种效果。因此出现构造函数和原型模式结合使用。

组合使用构造函数模式和原型模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["tom","tom1"];
} Person.prototype = {
constructor: Person,
sayName: function(){
alert(this.name);
}
} var person1 = new Person("tom",20,"hhtt");
var person2 = new Person("tom1",45,"chengxuyuan");

动态原型模式

有时候像这种分开写构造和原型,很可能会感到非常困惑。

动态原型模式解决这个问题,它将所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下)。

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);
}
}
}

寄生构造函数模式

建议在可以使用其他模式的情况下,不要使用这种模式。

稳妥构造函数模式

稳妥对象:顾名思义,就是很稳妥,指的是没有公共属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用this和new)。

function Person(naem,age,job){
var o = new Object(); o.sayName = function(){
alert(name);
}
} var friend = new Person("gg",20,"ghrhr");
friend.sayName(); //gg

总结:最开始是工厂模式。

为了标识特定类型的对象,出现构造函数模式。

为了减少创建多个没有多大关系的实例,浪费内存,出现原型模式。

为了减少修改一个实例上的属性而影响到另一个实例的属性,此时出现原型模式和构造函数相结合的模式。

至于后来的动态原型模式,寄生构造函数模式,稳妥构造函数模式,这些自己斟酌使用。

总结在这里,为大家提供一种记忆思路。

JavaScript之几种创建函数的区别以及优缺点。的更多相关文章

  1. JavaScript DOM三种创建元素的方式

    三种创建元素的方式: document.write() element.innerHTML document.createElement() 初始HTML内容: <button>btn&l ...

  2. javascript对象几种创建方式

    Javascript对象创建的几种方式  1.使用new运算符创建Object  var box=new Object();  box.name='肖能武';  box.age=28;    2.ne ...

  3. javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理

    有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...

  4. JavaScript的几种Math函数,random(),ceil(),round(),floor()

    1.Math.random():返回 0 ~ 1 之间的随机数.2.Math.ceil():返回值:返回大于或等于x,并且与之最接近的整数(如果x是正数,则把小数"入":如果x是负 ...

  5. javascript两种声明函数的方式的一次深入解析

    声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...

  6. 【javascript基础】2、函数

    前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道 ...

  7. JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链

    继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...

  8. 精读JavaScript模式(四),数组,对象与函数的几种创建方式

    一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...

  9. javascript创建函数的20种方式汇总

    http://www.jb51.net/article/68285.htm 工作中常常会创建一个函数来解决一些需求问题,以下是个人在工作中总结出来的创建函数20种方式,你知道多少? function ...

随机推荐

  1. ubuntu下调整cpu频率

    环境:ubuntu15.10 查看内核支持的cpu策略 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 比如我 ...

  2. Android 6.0 Marshmallow root 方法

    android 6.0 已经推出 release 版本了, nexus 5,6,7,9 都放了官方镜像, 本篇文章使用 nexus 6 安装最新的 android 6.0 并进行root step 1 ...

  3. mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析【转】

    转自:http://blog.csdn.net/chenyu105/article/details/7720162 重点关注关中断的情况.临时做了一个版本,在CPU 0上监控所有非0 CPU的时钟中断 ...

  4. C# 对后台方法事件,可以直接return; 跳出

    protected void lbtButton_Click(object sender, EventArgs e) { return; } C# 对后台方法事件,可以直接return; 跳出

  5. 1833: [ZJOI2010]count 数字计数——数位dp

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...

  6. HDU 6186 CS Course 前缀和,后缀和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6186 题意:给了n个数,然后有q个查询,每个查询要求我们删掉一个数,问删掉这个数后整个序列的与值,或值 ...

  7. Jmeter接口测试示例

    如果是Web,需要使用badboy进行录制,今天讲的是接口,因此可以不用录制. (1)新建测试计划 (2)添加http请求默认值 (3)添加http信息头管理器 (4)添加token的正则表达式:&q ...

  8. elasticsearch使用Analyze API

    curl -XGET 'localhost:9200/index_name/_analyze?pretty&field=type_name.field_name' -d 'Robots car ...

  9. Jquery动态添加元素并给元素增加onchange相应

    动态添加元素: $select = $("<select></select>"); $("<option></option> ...

  10. 封装ajax方法

    function ajaxRequest(type, url, data, callback, loading, cache) { var ajaxConfig = { url: '', data: ...