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用unbind方法去掉hover事件及其他方法介绍
Mar 18 Javascript
jquery实现滑动图片自己测试的例子
Nov 05 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
jquery实现简洁文件上传表单样式
Nov 02 Javascript
js 创建对象 经典模式全面了解
Aug 16 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
Nov 08 Javascript
angularjs ui-router中路由的二级嵌套
Mar 10 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
详解Webpack多环境代码打包的方法
Aug 03 Javascript
VueJS实现用户管理系统
May 29 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
Dec 19 Vue.js
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
隐性调用php程序的方法
2009/03/09 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
python复合条件下的字典排序
2020/12/18 Python
演讲稿怎么写才完美
2014/01/02 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
防灾减灾活动总结
2014/08/30 职场文书
党的生日演讲稿
2014/09/10 职场文书
写给领导的感谢信
2015/01/22 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript