javaScript中定义类或对象的五种方式总结


Posted in Javascript onDecember 04, 2016

第一种方式: 工厂方法

能创建并返回特定类型的对象的工厂函数(factory function)。

function createCar(sColor){ 
 var oTempCar = new Object; 
 oTempCar.color = sColor; 
 oTempCar.showColor = function (){ 
 alert(this.color); 
 }; 
 return oTempCar; 
 } 
 var oCar1 = createCar(); 
 var oCar2 = createCar();

调用此函数时,将创建新对象,并赋予它所有必要的属性。使用此方法将创建car对象的两个版本(oCar1和oCar2),他们的属性完全一样。

使用此方法存在的问题:

1语义上看起来不像使用带有构造函数的new运算符那么正规。

2使用这种方式必须创建对象的方法。每次调用createCar(),都要创建showColor(),意味着每个对象都有自己的showColor()版本,事实上,每个对象都共享了同一个函数。

有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法。从而避免这个问题:

function createCar(sColor){ 
var oTempCar = new Object; 
oTempCar.color = sColor; 
oTempCar.showColor = showColor; 
return oTempCar; 
} 
function showColor(){ 
alert(this.color); 
}

在这段重写的代码中,在函数createCar()前定义了函数showColor().在createCar()内部,赋予对象一个已经指向已经存在的showColor()函数的指针。从功能上来讲,这样解决了重复创建对象的问题,但该函数看起来不像对象的方法。

所有这些问题引发了开发者定义的构造函数的出现。

第二种方式:构造函数方式

function Car(sColor){ 
this.color = sColor; 
this.showColor = function (){ 
alert(this.color); 
}; 
} 
var oCar1 = new Car("red"); 
var oCar2 = new Car("blue");
你可能已经注意到第一个差别了,在构造函数内部无创建对象,而是使用this关键字。使用new运算符调用构造函数时,在执行第一行代码前先创建一个对象,只有用this才能访问该对象。然后可以直接赋予this属性,默认情况下是构造函数的返回值(不必明确使用return运算符)。

这种方式在管理函数方面与工厂方法一样都存在相同的问题。

第三种方式:原型方式

function Car(){ 
} 
Car.prototype.color = "blue"; 
var oCar1 = new Car(); 
var oCar2 = new Car();

调用new Car()时,原型的所有属性都被立即赋予要创建的对象,意味着所有的Car实例存放的都是指向showColor()函数的指针。从语义上看起来都属于一个对象,因此解决了前面两种方式存在的两个问题。此外使用该方法,还能用instanceof运算符检查给定变量指向的对象类型。因此,下面的代码将输出true:

alert(oCar instanceof Car); //outputs "true"

这个方式看起来很不错,遗憾的是,它并不尽如人意。

1首先这个构造函数没有参数。使用原型方式时,不能给构造函数传递参数初始化属性的值,因为car1和car2的属性都等于“red”。

2真正的问题出现在属性指向的是对象,而不是函数时。函数共享不会造成任何问题,但是对象却很少被多个实例共享的。

第四种方式:混合的构造函数/原型方式(推荐)

联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。

function Car(sColor){ 
this.color =sColor; 
this.drivers =new Array("Mike","Sue"); 
} 
Car.prototype.showColor = function(){ 
alert(this.color); 
} 
var oCar1 =new Car("red"); 
var oCar2 =new Car("blue"); 
oCar1.drivers.push("Matt"); 
alert(oCar1.drivers); //outputs "Mike,Sue,Matt" 
alert(oCar1.drivers); //outputs "Mike,Sue"

第五种方式:动态原型方式(推荐)

对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。批评混合的构造函数/原型方式的人认为,在构造函数内找属性,在外部找方法的做法很不合理。所以他们设计了动态原型方式,以提供更友好的编码风格。

动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。下面是使用动态原型方法重写的Car类:

function Car(sColor){ 
this.color =sColor; 
this.drivers =new Array("Mike","Sue"); 
if(typeof Car._initialized == "undefined"){ 
Car.prototype.showColor = function(){ 
alert(this.color); 
} 
} 
Car._initialized = true; 
}

以上这篇javaScript中定义类或对象的五种方式总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用IE的地址栏来辅助调试Web页脚本
Mar 08 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
详解Jquery Easyui的验证扩展
Jan 09 Javascript
详解关于react-redux中的connect用法介绍及原理解析
Sep 11 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
Dec 28 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
JavaScript 实现同时选取多个时间段的方法
Oct 17 Javascript
Javascript中关于Array.filter()的妙用详解
Dec 04 #Javascript
JavaScript 中对象的深拷贝
Dec 04 #Javascript
详解JavaScript模块化开发
Dec 04 #Javascript
javascript 定时器工作原理分析
Dec 03 #Javascript
JavaScript 最佳实践:帮你提升代码质量
Dec 03 #Javascript
简单理解Vue条件渲染
Dec 03 #Javascript
学习vue.js条件渲染
Dec 03 #Javascript
You might like
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
php格式化金额函数分享
2015/02/02 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
js登录弹出层特效
2014/03/07 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
Python中的super()方法使用简介
2015/08/14 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
公务员职业生涯规划书范文  
2014/01/19 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
出生医学证明书
2014/09/15 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2014年城管工作总结
2014/11/20 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书