JavaScript之工厂方式 构造函数方式 原型方式讲解
一、工厂方式可以为一个对象,创建多个实例。
- var oCar = new Object;
- oCar.color = "red";
- oCar.doors=4;
- oCar.mpg=23;
- oCar.showColor = function(){
- alert(this.color);
- }
上面的代码,创建car对象,并赋予属性和方法。执行代码后就可以使用对象,问题是我们经常需要重复、创建多个实例。
解决此问题的方法是:创建能够返回特定类型的对象的工厂函数。
- function createCar(){
- var oTempCar = new Object;
- oTempCar.color = "red";
- oTempCar.doors= 4;
- oTempCar.mpg = 23;
- oTempCar.showColor= function(){
- alert(this.doors);
- }
- return oTempCar;
- }
- var oCar1 = createCar();
- var oCar2 = createCar();
执行代码,将创建2个car对象。
上面的代码仍存在问题:为每个对象创建独立的函数版本,但实际上他们的函数功能是一样的,无需独立创建。
解决方法:创建外部函数重写工厂函数。
- function showColor(){
- alert(this.color);
- }
- function createCar(){
- var oTempCar = new Object;
- oTempCar.color = "red";
- oTempCar.doors = 4;
- oTempCar.mpg = 23;
- oTempCar.showColor = showColor;
- return oTempCar;
- }
二、构造函数方式
在构造函数内部无需创建对象,而是使用this关键字。使用new调用构造函数。
- function Car(sColor, iDoors, iMpg){
- this.color = sColor;
- this.doors= iDoors;
- this.mpg = iMpg;
- this.showColor = function(){
- alert(this.color);
- };
- }
- var oCar1 = new Car("red", 4, 23);
- car oCar2 = new Car("blue",3, 25);
与工厂方式相同,构造函数也存在无法共享方法的问题。解决方法仍然是使用外部函数。
三、原型方式
该方式利用了对象的prototype属性,可以把它看成创建新对象所依赖的原型。
- function Car(){} //创建空构造函数类名
- Car.prototype.color = "red";
- Car.prototype.doors= 4;
- Car.prototype.mpg = 23;
- Car.prototype.showColor = function(){
- alert(this.color);
- }
- var oCar1 = new Car();
- var oCar2 = new Car();
所有的属性和方法都被直接赋予创建对象所依赖的原型prototype属性。
原型方式很好的解决了构造函数方式、工厂方式的无法共享方法问题,但却出现一个新问题:无法传递参数,初始化属性。
四、混合方式
看到三者的优缺点,唯有混合使用它们。
- function Car(sColor, iDoor, iMpg){
- this.color = sColor;
- this.doors=iDoors;
- this.mpg = iMpg;
- this.drivers = new Array("Mike","Sue");
- }
- Car.prototype.showColor = function(){
- alert(this.color);
- }
- var oCar1 = new Car("red", 4, 23);
- var oCar2 = new Car("blue", 3, 25);
- oCar1.drivers.push("Matt");
- alert(oCar1.drivers); //输出 "Mike,Sue,Matt"
- alert(oCar2.drivers);//输出 "Mike,Sue"
1、使用构造函数方式,解决了传递参数的问题。
2、使用原型方式解决了共享函数指向同一函数指针的问题。
JavaScript之工厂方式 构造函数方式 原型方式讲解的更多相关文章
- javascript继承之借用构造函数与原型
javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...
- Javascript面向对象——创建对象、构造函数的原型
Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...
- JavaScript对象的创建之动态原型方式
为了让定义的方式更加符合java的需求,就把定义方法的原型代码放置在Person这个构造函数中. function Person(name,age,friends){ //属性在构造函数中定义 thi ...
- JavaScript对象的创建之基于原型方式
原型内存模型介绍 原型是javascript中非常特殊的一个对象,当一个函数创建之后,会随之就产生一个原型对象. 当通过这个函数的构造函数创建一个具体的对象之后,在这个具体的对象中就会有一个属性指向原 ...
- JavaScript中定义对象的四种方式
最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...
- 声明对象的方式/构造函数/原型/this指向
函数的发展历程(声明函数的方式): 1.通过Object构造函数或字面量的方式创建单个对象 var obj = new Object; obj.name="新华"; o ...
- JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式
1.单例模式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- JavaScript高级特性-创建对象的九种方式
1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...
- Javascript中函数的四种调用方式
一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...
随机推荐
- IOS学习3
@property属性使用 copy:NSString strong: 一般对象 weak: UI空间 assign:基本数据类型 retain: (对象,先上述类型使用) id 万能指针. id缺点 ...
- Delphi XE5 for android 使用 BITMAP STYLE DESIGNER 改变控件背景
一.BITMAP STYLE DESIGNER 工具集成在IDE开发工具的TOOLS菜单. 使用NEW 新建一个安卓样式.NEW—NEW ANDROID STYLE FOR FIREMONKEY. 这 ...
- Python入门和基础
Python应用领域 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube ...
- feel
昨天我大脑中还在盘旋几个关键字:健康 选择 方向 方法今天只有选择了,健康 是你选择了一种生活习惯,你能掌控的也就是好的习惯,选择了一种正确的价值观,选择了一个好的开始方向有很多,你的选择是结果方法 ...
- 【转载/修改】ScrollLayout代码修正,追加模仿viewpager滚动速度
组件作用为类似ViewPager但直接插视图的横向滚动容器. 修改自:http://blog.csdn.net/yaoyeyzq/article/details/7571940 在该组件基础上修正了滚 ...
- DIV指令一般用法
本文最初发表于2015-8-14,是由别的地方迁移过来的 (本文所讲为无符号运算) DIV指令是8086汇编中的除法运算指令,它的结果不是浮点数,而是两个整数:商和余数. 我们来看王爽老师是怎么讲的: ...
- Linux 常见的进程调度算法
1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以 ...
- EMVTag系列11《电子现金发卡行授权码》
按照银联个人化模板的建议,如卡片支持非接触快速支付应用(qPBOC),则推荐将电子现金授权码(9F74)作为qPBOC 应用AFL列表中的最后一条记录,且最后一条记录仅包含该数据元. 原因是:在某些情 ...
- hdu 5104 Primes Problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...
- android开发中经常遇到的问题汇总
大家都在为项目开发成功而喜悦,但可不知成功的路上是会经常出错的,下面是我碰到的一些错误集合! [错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Appl ...