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 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
JQuery将文本转化成JSON对象需要注意的问题
May 09 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
Jun 30 Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
JavaScript实现打开链接页面的方式汇总
Jun 02 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
Bootstrap插件全集
Jul 18 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
Apr 23 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
vue中使用vue-pdf的方法详解
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
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
php计算整个目录大小的方法
2015/06/19 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
简单了解Django模板的使用
2017/12/20 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
事业单位辞职信范文
2014/01/19 职场文书
写求职信有什么意义
2014/02/17 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
教师师德演讲稿
2014/05/06 职场文书
三下乡个人总结
2015/03/04 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python