JS 创建对象的模式实例小结


Posted in Javascript onApril 28, 2020

本文实例总结了JS 创建对象的模式。分享给大家供大家参考,具体如下:

1.工厂模式

抽象了创建具体对象的过程,创建了一种函数,封装特定的接口创建对象的细节。

  • 新建一个对象
  • 定义属性和方法
  • return刚新建的对象
function createPerson(name, age, job) {
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 obj.job = job;
 obj.sayHi = function() {
 congsole.log(this.name);
 };
 return obj;
}

var person1 = createPerson("name1", "age1", "job1");
var person2 = createPerson("name2", "age2", "job2");

存在问题:

没有解决对象识别的问题(怎么识别对象的类型)

2.构造函数模式

  • 不显式创建对象
  • 直接将属性和方法定义在this
  • 没有return
  • 通过 new操作符调用
function Person(name, age, job) {
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayHi = function() {
 console.log(this.name);
 };
}

var person1 = new Person("name1", "age1", "job1");
var person2 = new Person("name2", "age2", "job2");

存在问题:

  • 每个方法都要在实例上创建一次

3.原型模式

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

所有原生引用类型都在其构造函数的原型上定义了方法

function Person{

}

Person.prototype.name="name"
Person.prototype.age="age"
Person.prototype.job="job"
Person.prototype.sayHi=function(){
 console.log(this.name)
}

var person1=new Person()
var person2=new Person()

存在问题:

  • 所有属性是被很多实例共享的

4.组合构造和原型模式

构造函数用来定义实例属性,原型模式用来定义方法和共享的属性

function Person(name, age, job) {
 this.name = name;
 this.age = age;
 this.job = job;
}
Person.prototype={
 constructor:Person;
 sayHi:function(){
 console.log(this.name)
 }
}

var person1 = new Person("name1", "age1", "job1");

5.动态原型模式

这里对原型的修改,能够对所有实例生效,只在初次调用构造函数会执行

function Person(name,age,job){
 this.name=name;
 this.age=age;
 this.job=job;
 if(typeof this.sayHi !="function" ){
 Person.prototype.sayHi=functong(){
  console.log(this.name)
 }
 }
}

var person1 = new Person("name1", "age1", "job1");

6.寄生构造函数模式

工厂模式+构造函数

  • 返回的对象与构造函数、构造函数的原型属性之间没有关系
  • 不能依赖instanceof来去定对象原型
  • 不建议使用
function Person(name, age, job) {
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 obj.job = job;
 obj.sayHi = function() {
 congsole.log(this.name);
 };
 return obj;
}

var person1 = new Person("name1", "age1", "job1");

7.稳妥构造模式

  • 没有公共属性
  • 不使用this
  • 不使用new
function Person(name, age, job) {
 var obj = new Object();
 // 定义室友变量和函数
 obj.sayHi = function() {
 congsole.log(name);
 };
 return obj;
}

var person1 = Person("name1", "age1", "job1");
// name1

摘抄自《JavaScript 高级程序设计》第六章

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
javascript下数值型比较难点说明
Jun 07 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
javascript设计模式--策略模式之输入验证
Nov 27 Javascript
javascript使用Promise对象实现异步编程
Mar 01 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
详解微信小程序 页面跳转 传递参数
Dec 08 Javascript
JS仿淘宝搜索框用户输入事件的实现
Jun 19 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
JavaScript console的使用方法实例分析
Apr 28 #Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 #Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 #Javascript
JavaScript 链表定义与使用方法示例
Apr 28 #Javascript
Vue 3.0 全家桶抢先体验
Apr 28 #Javascript
React生命周期原理与用法踩坑笔记
Apr 28 #Javascript
js最全的数组的降维5种办法(小结)
Apr 28 #Javascript
You might like
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
js 编程笔记 无名函数
2011/06/28 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python 错误和异常小结
2013/10/09 Python
Python中使用HTMLParser解析html实例
2015/02/08 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
python/golang 删除链表中的元素
2020/09/14 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
C#笔试题集合
2013/06/21 面试题
函授大专自我鉴定
2013/11/01 职场文书
护士节策划方案
2014/05/19 职场文书
商务经理岗位职责
2014/08/03 职场文书
防暑降温通知书
2015/04/27 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python