JavaScript之几种创建函数的区别以及优缺点。
工厂模式
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之几种创建函数的区别以及优缺点。的更多相关文章
- JavaScript DOM三种创建元素的方式
三种创建元素的方式: document.write() element.innerHTML document.createElement() 初始HTML内容: <button>btn&l ...
- javascript对象几种创建方式
Javascript对象创建的几种方式 1.使用new运算符创建Object var box=new Object(); box.name='肖能武'; box.age=28; 2.ne ...
- javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理
有一种创建对象的方法叫做工厂模式,例如: function person(name,age){ var o=new Object(); o.name=name; o.age=age; return o ...
- JavaScript的几种Math函数,random(),ceil(),round(),floor()
1.Math.random():返回 0 ~ 1 之间的随机数.2.Math.ceil():返回值:返回大于或等于x,并且与之最接近的整数(如果x是正数,则把小数"入":如果x是负 ...
- javascript两种声明函数的方式的一次深入解析
声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...
- 【javascript基础】2、函数
前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道 ...
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- 精读JavaScript模式(四),数组,对象与函数的几种创建方式
一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...
- javascript创建函数的20种方式汇总
http://www.jb51.net/article/68285.htm 工作中常常会创建一个函数来解决一些需求问题,以下是个人在工作中总结出来的创建函数20种方式,你知道多少? function ...
随机推荐
- Python标准库笔记(4) — collections模块
这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...
- 【设计模式】原型模式(Prototype)
摘要: 1.本文将详细介绍原型模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入原型模式 2. 原型模式的概念及优缺点介绍 3. 原型模式对拷贝的使用 4. 原型模式在A ...
- 64_d2
dtc-1.4.4-2.fc26.x86_64.rpm 20-Jun-2017 11:04 89890 dtdinst-20131210-7.fc26.noarch.rpm 11-Feb-2017 0 ...
- write-ups
https://github.com/MarioVilas/write-ups https://github.com/Deplorable-Mountaineer/Robot_Dynamite htt ...
- Makefile系列之一 : 书写规则
1. 规则 target : prerequisites command 2. example excute 为最终生成的可执行文件. 可以通过命令 make clean来删除所有编译时产生的中间文 ...
- [New learn]@class和#import的区别使用
1.简介 我们在查看代码的时候经常会发现有些地方使用@class而有些地方使用#import,他们到底有什么区别呢, 本文意图去归纳和总结这两种类引用的是的处理方法和规则. 2.分析 此小节会通过一些 ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- LeetCode解题报告—— 2 Keys Keyboard & Longest Palindromic Substring & ZigZag Conversion
1. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...
- redis之(三)redis的数据类型
[一]字符串类型(基本数据类型) --->字符串类型是redis的最基本的数据类型 --->能存储任何形式的字符串,(用户邮箱,json化的对象,一张图片) --->一个字符串类型的 ...
- QQ分享 QQ空间分享 API链接:
QZone: "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITL ...