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 相关文章推荐
一个可以随意添加多个序列的tag函数
Jul 21 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
Jan 15 Javascript
详解JavaScript中循环控制语句的用法
Jun 03 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
微信小程序保存多张图片的实现方法
Mar 05 Javascript
JS使用正则表达式实现常用的表单验证功能分析
Apr 30 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 Javascript
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
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
php生成二维码
2015/08/10 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
python 产生token及token验证的方法
2018/12/26 Python
python hough变换检测直线的实现方法
2019/07/12 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
主管会计岗位职责
2014/03/13 职场文书
安全责任协议书
2014/04/21 职场文书
学生期末评语大全
2014/04/30 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
银行求职自荐书
2014/06/25 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
python实现手机推送 代码也就10行左右
2022/04/12 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers