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 相关文章推荐
jquery radio 操作代码
Mar 16 Javascript
Yii2使用Bootbox插件实现自定义弹窗
Apr 02 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
javaScript之split与join的区别(详解)
Nov 08 Javascript
Vue CLI3 如何支持less的方法示例
Aug 29 Javascript
详解Vue2 添加对scss的支持
Jan 02 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
基于JS实现数字动态变化显示效果附源码
Jul 18 Javascript
vue实现简单跑马灯效果
May 25 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 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
PHP STRING 陷阱原理说明
2010/07/24 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
python字典排序实例详解
2015/05/20 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
python算的上脚本语言吗
2020/06/22 Python
Python 爬虫的原理
2020/07/30 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
Shell编程面试题
2016/05/29 面试题
销售文员的岗位职责
2013/11/20 职场文书
小班开学寄语
2014/04/04 职场文书
中学生励志演讲稿
2014/04/26 职场文书
二年级学生期末评语
2014/12/26 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
2019年思想汇报
2019/06/20 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
OpenFeign实现远程调用
2022/08/14 Java/Android