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入门教程(9) Document文档对象
Jan 31 Javascript
JQuery中如何传递参数如click(),change()等具体实现
Apr 28 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
JavaScript 异常处理 详解
Feb 06 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
详解React 在服务端渲染的实现
Nov 16 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
Jul 26 Javascript
electron实现qq快捷登录的方法示例
Oct 22 Javascript
JavaScript Array对象基本方法详解
Sep 03 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
Nov 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
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
python多线程扫描端口示例
2014/01/16 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
python自动化生成IOS的图标
2018/11/13 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python操作redis数据库的三种方法
2020/09/10 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
C#实现启动一个进程
2016/10/01 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
中学生期末评语
2014/02/03 职场文书
项目经理任命书
2014/06/04 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
《雷雨》教学反思
2016/02/20 职场文书