js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)


Posted in Javascript onNovember 09, 2015

在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧。

前言

虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码。因此为了解决这个问题,人们开始使用以下几种方式来常见对象。

工厂模式

该模式抽象了创建对象的具体过程,用函数来以特定接口创建对象的细节

function cPerson(name,sex,age){
 var o = new Object();
 o.name = name;
 o.sex = sex;
 o.age = age;
 o.show = function(){
 console.log(this.name,this.age,this.sex);
 }
 return o;
}
 var p1 = cPerson('谦龙','男','100');
 p1.show();
 var p2 = cPerson('雏田','女','14');
 p2.show();

工厂模式测试

工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型)

构造函数模式

function CPerson(name,sex,age) {//注意这里 构造函数首字母大写
 this.name = name;
 this.sex = sex;
 this.age = age;
 this.show = function () {
 console.log(this.name, this.age, this.sex);
 }
}
var p1 = new CPerson('谦龙','男','100');
 p1.show();
var p2 = new CPerson('雏田','女','14');
 p2.show();

构造函数模式测试

注意构造函数与工厂模式有些不同的地方,如下

构造函数首字母大写

没有显式地创建对象

将属性和方法赋值给了 this 对象

没有return语句

而且以这种方式来调用构造函数会大致经历一下 几个步骤

创建一个新的对象

将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)

执行构造函数中的代码(即给新对象添加属性和方法的过程)

返回对象

注意:构造函数其实和普通的函数没有太大的差别,唯一的不同在于调用方式的不同。以下演示不同的几种调用方式

// 调用方式1 new 方式
 var p1 = new CPerson('谦龙','男','100');
 p1.show();//谦龙 100 男
 // 调用方式2 普通函数调用
 CPerson('谦龙','男','100');
 window.show()//谦龙 100 男 注意属性和方法会被设置到window对象上
 // 调用方式3 在另一个对象的作用域中调用
 var obj = new Object();
 CPerson.call(obj,'谦龙','男','100');
 obj.show(); //谦龙 100 男 在obj的作用域

构造函数的问题:使用构造函数最主要的问题就是每个方法都要在每个实例上重新创建一次,p1与p2的都有show方法,但不是同一个Function的实例,因为function在js中也是一个对象。因此他们共有的show方法并不相等。

原型模式

每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。而这个对象的用途是 包含可以由 特定类型 的所有 实例 共享的属性和方法。即调用构造函数所创建的那个对象的 原型对象

好处是可以让所有对象的实例共享他的属性的方法。即无需在构造函数中定义实例的信息

function CPerson(){
}
CPerson.prototype.name='谦龙';
CPerson.prototype.sex='男';
CPerson.prototype.age=100;
CPerson.prototype.show=function(){
 console.log(this.name, this.age, this.sex);
}
var p1 = new CPerson();
 p1.show(); //谦龙 100 男
var p2 = new CPerson();
 p2.show();//谦龙 100 男
 console.log(p1.show == p2.show)//true

以上内容是关于js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式),希望大家喜欢。

Javascript 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
Jan 17 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 Javascript
让ie6也支持websocket采用flash封装实现
Feb 18 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
javascript中2个感叹号的用法实例详解
Sep 04 Javascript
Jquery操作cookie记住用户名
Mar 29 Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
May 10 Javascript
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
Feb 01 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
Nov 09 #Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
Nov 09 #Javascript
JavaScript实现同时调用多个函数的方法
Nov 09 #Javascript
javascript实现的登陆遮罩效果汇总
Nov 09 #Javascript
jquery实现简易的移动端验证表单
Nov 08 #Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 #Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
Nov 07 #Javascript
You might like
php自动给网址加上链接的方法
2015/06/02 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
利用Python实现图书超期提醒
2016/08/02 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python读取文件名称生成list的方法
2018/04/27 Python
Python中的TCP socket写法示例
2018/05/11 Python
python实现抖音视频批量下载
2018/06/20 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python机器人运动范围问题的解答
2019/04/29 Python
python相对企业语言优势在哪
2020/06/12 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
品质主管的岗位职责
2013/12/04 职场文书
机关门卫制度
2014/02/01 职场文书
政府门卫岗位职责
2014/04/29 职场文书
活动宣传策划方案
2014/05/23 职场文书
中秋晚会策划方案
2014/06/12 职场文书
管理人员岗位职责
2015/02/14 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server