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 相关文章推荐
学习从实践开始之jQuery插件开发 对话框插件开发
Apr 26 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
jQuery实现网站添加高亮突出显示效果的方法
Jun 26 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
javascript中this关键字详解
Dec 12 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
解读ES6中class关键字
Nov 20 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
解决Vue @submit 提交后不刷新页面问题
Jul 18 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
JavaScript初学者必看“new”
2017/06/12 Javascript
详解vue中组件参数
2018/07/09 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
项目建议书格式
2014/03/12 职场文书
甜品店创业计划书
2014/09/21 职场文书
具结保证书
2015/01/17 职场文书
2015年林业工作总结
2015/05/14 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis