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 EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
JQuery for与each性能比较分析
May 14 Javascript
extjs每个组件要设置唯一的ID否则会出错
Jun 15 Javascript
javascript返回顶部的按钮实现方法
Jan 09 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
JS+H5 Canvas实现时钟效果
Jul 20 Javascript
vue移动端项目缓存问题实践记录
Oct 29 Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 Javascript
JavaScript实现筛选数组
Mar 02 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
js单词形式的运算符
2014/05/06 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python字典遍历操作实例小结
2019/03/05 Python
python调用自定义函数的实例操作
2019/06/26 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
python图形用户接口实例详解
2019/12/16 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
机电一体化应届生求职信
2014/08/09 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
婚宴主持词
2015/06/30 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js