JS定义类的六种方式详解


Posted in Javascript onMay 12, 2016

在前端开发中,经常需要定义JS类。那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类的六中方式说明如下(案例说明):

1、工厂方式

function Car(){
var ocar = new Object;
ocar.color = “blue”;
ocar.doors = 4;
ocar.showColor = function(){
document.write(this.color)
};
return ocar;
}
var car1 = Car();
var car2 = Car();

调用此函数时将创建新对象,并赋予它所有的属性和方法。使用此函数可以创建2个属性完全相同的对象。

当然可以通过给它传递参数来改版这种方式。

function Car(color,door){
var ocar = new Object;
ocar.color = color;
ocar.doors = door;
ocar.showColor = function(){
document.write(this.color)
};
return ocar;
}
var car1 = Car(“red”,4);
var car2 = Car(“blue”,4);
car1.showColor() //output:”red”
car2.showColor() //output:”blue”

现在可以通过给函数传递不同的参数来得到具有不同值的对象。

在前面的例子中,每次调用函数Car(),都要创建showcolor(),意味着每个对象都有一个自己的showcolor()方法。

但是事实上,每个对象斗共享了同一个函数。 虽然可以在函数外定义方法,然后通过将函数的属性指向该方法。

function showColor(){

alert(this.color);
}
function Car(){
var ocar = new Object();
ocar.color = color;
ocar.doors = door;
ocar.showColor = showColor;
return ocar;
}

但是这样看起来不像是函数的方法。

2、构造函数方式

构造函数方式同工厂方式一样简单,如下所示:

function Car(color,door){
this.color = color;
this.doors = door;
this.showColor = function(){
alert(this.color)
};
}
var car1 = new Car(“red”,4);
var car2 = new Car(“blue”,4);

可以看到构造函数方式在函数内部没有创建对象,是用this关键字。因为在调用构造函数时已经创建了对象,而在函数内部只能用this来访问对象属性。

现在用new来创建对象,看起来像那么回事了!但是它同工厂方式一样。每次调用都会为对象创建自己的方法。

3、原型方式

该方式利用了对象的prototype属性。首先用空函数创建类名,然后所有的属性和方法都被赋予prototype属性。

function Car(){
}
Car.prototype.color = “red”;
Car.prototype.doors = 4;
Car.prototype.showColor = function(){
alert(this.color);
}
var car1 = new Car();
var car2 = new Car();

在这段代码中,首先定义了一个空函数,然后通过prototype属性来定义对象的属性。调用该函数时,原型的所有属性都会立即赋予要创建的对象,所有该函数的对象存放的都是指向showColor()的指针,语法上看起来都属于同一个对象。

但是这个函数没有参数,不能通过传递参数来初始化属性,必须要在对象创建后才能改变属性的默认值。

原型方式有个很严重的问题就是当属性指向的是对象时,如数组。

function Car(){
}
Car.prototype.color = “red”;
Car.prototype.doors = 4;
Car.prototype.arr = new Array(“a”,”b”);
Car.prototype.showColor = function(){
alert(this.color);
}
var car1 = new Car();
var car2 = new Car();
car1.arr.push(“cc”);
alert(car1.arr); //output:aa,bb,cc
alert(car2.arr); //output:aa,bb,cc

这里由于数组的引用值,Car的两个对象指向的都是同一个数组,所以当在car1添加值后,在car2中也可以看到。

联合是用构造函数/原型方式就可以像其他程序设计语言一样创建对象,是用构造函数定义对象的非函数属性,用原型方式定义对象的方法。

function Car(color,door){
this.color = color;
this.doors = door;
this.arr = new Array(“aa”,”bb”);
}
Car.prototype.showColor(){
alert(this.color);
}
var car1 = new Car(“red”,4);
var car2 = new Car(“blue”,4);
car1.arr.push(“cc”);
alert(car1.arr); //output:aa,bb,cc
alert(car2.arr); //output:aa,bb

5、动态原型方式

动态原型的方式同混合的构造函数/原型方式原理相似。唯一的区别就是赋予对象方法的位置。

function Car(color,door){
this.color = color;
this.doors = door;
this.arr = new Array(“aa”,”bb”);
if(typeof Car._initialized == “undefined”){
Car.prototype.showColor = function(){
alert(this.color);
};
Car._initialized = true;
}
}

动态原型方式是使用一个标志来判断是否已经给原型赋予了方法。这样可以保证该方法只创建一次

6、混合工厂方式

它的目的师创建假构造函数,只返回另一种对象的新实例。

function Car(){
var ocar = new Object();
ocar.color = “red”;
ocar.doors = 4;
ocar.showColor = function(){
alert(this.color)
};
return ocar;
}

与工厂方式所不同的是,这种方式使用new运算符。

以上就是全部的创建对象方法。目前使用最广泛的就是混合构造函数/原型方式,此外,动态原型方式也很流行。在功能上与构造函数/原型方式等价。

以上这篇JS定义类的六种方式详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
JS的replace方法介绍
Oct 20 Javascript
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
iframe实用操作锦集
Apr 22 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
May 12 Javascript
JS HTML5拖拽上传图片预览
Jul 18 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
深入理解ES6的迭代器与生成器
Aug 19 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
Oct 18 Javascript
微信小程序页面渲染实现方法
Nov 06 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 Javascript
值得分享和收藏的Bootstrap学习教程
May 12 #Javascript
jQuery中$.each()函数的用法引申实例
May 12 #Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 #Javascript
JavaScript的模块化开发框架Sea.js上手指南
May 12 #Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 #Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 #Javascript
深入浅析JavaScript中with语句的理解
May 12 #Javascript
You might like
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
python解析json实例方法
2013/11/19 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
shell程序中如何注释
2012/01/28 面试题
金融系应届毕业生求职信
2014/05/26 职场文书
战略合作意向书
2014/07/29 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
英语教师个人总结
2015/02/09 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android