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与C# Windows应用程序交互方法
Jun 29 Javascript
精通JavaScript 纠正 cleanWhitespace函数
Mar 11 Javascript
javascript 实用的文字链提示框效果
Jun 30 Javascript
js 判断计算字符串长度/判断空的简单方法
Aug 05 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 Javascript
JS Generator 函数的含义与用法实例总结
Apr 08 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
Nov 16 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
php图片验证码代码
2008/03/27 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
如何用python整理附件
2018/05/13 Python
python实现多张图片拼接成大图
2019/01/15 Python
从0开始的Python学习016异常
2019/04/08 Python
python日期相关操作实例小结
2019/06/24 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
爱护公物标语
2014/06/24 职场文书
党支部四风整改方案
2014/10/25 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
python基础之while循环语句的使用
2021/04/20 Python
python opencv旋转图片的使用方法
2021/06/04 Python