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 相关文章推荐
javascript编程起步(第四课)
Jan 10 Javascript
js模拟弹出效果代码修正版
Aug 07 Javascript
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
jQuery中toggleClass()方法用法实例
Jan 05 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 Javascript
详解angular中通过$location获取路径(参数)的写法
Mar 21 Javascript
React-router v4 路由配置方法小结
Aug 08 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 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中文件上传的一个问题
2010/09/04 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
Vue程序调试的方法
2019/06/17 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
对python中的argv和argc使用详解
2018/12/15 Python
基于python生成器封装的协程类
2019/03/20 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
python操作yaml说明
2020/04/08 Python
应届毕业生自我评价分享
2013/12/15 职场文书
会计与审计毕业生自荐信范文
2013/12/30 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
电话客服工作职责
2014/07/27 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android