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 ...
随机推荐
- [Leetcode Week12]Unique Paths
Unique Paths 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/unique-paths/description/ Description A ...
- mysql innodb 数据表不存在
方法一: https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html 修改my.cnf文件 [mysqld] innodb ...
- [ python ] 查询数据库生成Excel并发送邮件
开发要求: 由于管理后台导出数据非常缓慢,找程序员解决无果后,自己动手写了一个脚本,每天定时将报表发送给业务部门. 1. 通过条件查询MySQL获取数据 2. 将获取的数据写入到Excel ...
- elasticsearch使用Analyze API
curl -XGET 'localhost:9200/index_name/_analyze?pretty&field=type_name.field_name' -d 'Robots car ...
- HDU-1083
Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- WordPress Shortcode(简码)介绍及使用详解
WordPress 从 2.5 版本开始增加了一个类似 BBCode 标签的 Shortcode API,可以使用它在日志的内容中来给日志内容添加各种功能.Shortcode 这个接口非常容易使用,并 ...
- 智能社官网顶部导航实现demo
从智能社的blue老师公开课中学习到了很多,在此表示感谢. 这个导航很好玩,于是就想实现一个. html <div id="box"> <ul> <l ...
- 用Lucene.net对数据库建立索引及搜索<转>
用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...
- 错误:在maven install是抛出 “1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符”
Maven默认用的是JDK1.5去编译 diamond运算符,有的书翻译为菱形,有的书写的是钻石语法,指的是JDK1.7的一个新特性 List<String> list = new Arr ...
- App Center编译React Native平台Android应用
做React Native一段时间后,对于React Native的发布有一些了解,原本的方法都是在本地直接生成APK文件的,具体可以参考<react native 生成APK> 因为需要 ...