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 相关文章推荐
js 无提示关闭浏览器页面的代码
Mar 09 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
jQuery中判断对象是否存在的方法汇总
Feb 24 Javascript
基于jquery实现百度新闻导航菜单滑动动画
Mar 15 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
Mar 08 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
React Native日期时间选择组件的示例代码
Apr 27 Javascript
小程序自定义单页面、全局导航栏的实现代码
Mar 15 Javascript
Javascript节流函数throttle和防抖函数debounce
Dec 03 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 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
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php5.3 注意事项说明
2013/07/01 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
javascript正则表达式之search()用法实例
2015/01/19 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
金融行业务员的自我评价
2013/12/13 职场文书
毕业设计计划书
2014/01/09 职场文书
预备党员政审材料
2014/02/04 职场文书
北京青年观后感
2015/06/15 职场文书
实习证明格式范文
2015/06/16 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫