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 相关文章推荐
取键盘键位ASCII码的网页
Jul 30 Javascript
javascript 一些用法小结
Sep 11 Javascript
爆炸式的JS圆形浮动菜单特效代码
Mar 03 Javascript
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
Dec 26 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
微信小程序入口场景的问题集合与相关解决方法
Jun 26 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
vue 调用 RESTful风格接口操作
Aug 11 Javascript
解决Vue-cli无法编译es6的问题
Oct 30 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+DBM的同学录程序(4)
2006/10/09 PHP
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
python时间time模块处理大全
2020/10/25 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
酒店保洁主管岗位职责
2013/11/28 职场文书
优秀家长自荐材料
2014/08/26 职场文书
团队拓展训练感想
2015/08/07 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python