厘清面向对象四种模式:工厂模式、构造函数模式、原型模式、混合模式

面向对象是一种方法,用来封装功能,方便日后使用,避免大量的重复工作

一、工厂模式

(一)实现方法:在函数内创建一个对象并给对象赋予属性及方法,最终将对象返回。

 1 function cPerson(name,sex,age){
 2  var o = new Object();
 3  o.name = name;
 4  o.sex = sex;
 5  o.age = age;
 6  o.show = function(){
 7  console.log(this.name,this.age,this.sex);
 8  }
 9  return o;
10 }
11  var p1 = cPerson(‘瀚哲,‘男‘,‘18‘);
12  p1.show();
13  var p2 = cPerson(‘丑小鸭‘,‘女‘,‘18‘);
14  p2.show();

(二)工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的来源和类型),因此出现了构造函数。

二、构造函数模式

(一)实现方法:

 1 function CPerson(name,sex,age) {
 2  this.name = name;
 3  this.sex = sex;
 4  this.age = age;
 5  this.show = function () {
 6  console.log(this.name, this.age, this.sex);
 7  }
 8 }
 9 var p1 = new CPerson(‘瀚哲 ‘,‘男‘,‘18‘);
10  p1.show();
11 var p2 = new CPerson(‘丑小鸭‘,‘女‘,‘14‘);
12  p2.show();

(二)构造函数与工厂模式的不同之处:

1.构造函数首字母大写

2.没有显式地创建对象

3.将属性和方法赋值给了 this 对象

4.没有return语句

(三)以这种方式来调用构造函数会大致经历以下几个步骤:

1.创建一个新的对象

2.将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)

3.执行构造函数中的代码(即给新对象添加属性和方法的过程)

4.返回对象

(四)构造函数的问题:

1.使用构造函数的最大的问题在于每次创建实例的时候都要重新创建一次方法(理论上每次创建对象的时候对象的属性均不同,而对象的方法是相同的),然而创建两次完全相同的方法是没有必要的,因此,我们可以将函数移到对象外面;

2.在全局作用域中定义了许多仅供特定对象使用的方法,浪费空间,显然失去了面向对象封装性了,因此可以通过原型来解决此问题。

三、原型模式

(一)实现方法: 创建的每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。使用原型对象的好处就是可以让所有对象实例共享它所包含的属性及方法。

 1 function CPerson(){
 2 }
 3 CPerson.prototype.name=‘瀚哲‘; 
 4 CPerson.prototype.sex=‘男‘;
 5 CPerson.prototype.age=100;
 6 CPerson.prototype.show=function(){
 7  console.log(this.name, this.age, this.sex);
 8 }
 9 var p1 = new CPerson();
10  p1.show(); //瀚哲 18 男
11 var p2 = new CPerson();
12  p2.show();//瀚哲 18 男
13  console.log(p1.show == p2.show)     //打印值为true 

(二)原型模式的问题:

1.它省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得了相同的属性值,这样非常不方便;

2.原型模式的最大问题在于共享的本性所导致,由于共享,因此一个实例修改了引用,另一个也随之更改了引用。因此我们通常不单独使用原型,而是结合原型模式与构造函数模式。

四、混合模式

 1 function CPerson(name,sex,age) {
 2      this.name = name;
 3      this.sex = sex;
 4      this.age = age;
 5      this.show();
 6 }
 7 CPerson.prototype.show = function(){
 8     alert(this.name + this.sex + this.age)
 9 }
10 var CPerson1 = new CPerson("甄瀚哲","男",18);
11 var CPerson2 = new CPerson("丑小鸭","女",18);
12 CPerson1.show();
13 CPerson2.show();

混合模式中构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。每个实例都会有自己的一份实例属性,但同时又共享着方法,最大限度的节省了内存。另外这种模式还支持传递初始参数。

原文地址:https://www.cnblogs.com/robint/p/11397395.html

时间: 2024-11-12 15:28:30

厘清面向对象四种模式:工厂模式、构造函数模式、原型模式、混合模式的相关文章

面向对象编程-基础(工厂、构造函数、原型、混合、动态等模式)

本文参考:js高级程序设计 第三版这篇文章我啃了大半天写的,是很烦,没有毅力看下去的注定还是不会(1).工厂模式:封装一个函数createPerson,这个函数可以创造一个人对象,包含三个属性和一个方法,然后利用这个函数分别创建了2个对象p1,p2. function createPerson(name,age,job){ var p=new Object(); p.name=name; p.age=age; p.job=job; p.showName=function(){ alert(thi

23种设计模式(5):原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类须要具备下面两个条件: 实现Cloneable接口.在java语言有一个Cloneable接口,它的作用仅仅有一个,就是在执行时通知虚拟机能够安全地在实现了此接口的类上使用clone方法.在java虚拟机中,仅仅有实现了这个接口的类才干够被拷贝,否则在执行时会抛出CloneNotSupportedExcep

基于上一篇的模块化思路,巩固个小知识点——构造函数与原型模式

具体可参考红皮书第三版中的6.2.4章 书中的例题详细讲解了什么是原型模式 function fop(){}; fop.prototype.name="xiaohong"; fop.prototype.age="12"; fop.prototype.sayName=function(){ console.log(this.name); } var per1=new fop(); per1.sayName(); var per2=new fop(); per2.say

JS中面向对象的,对象理解、构造函数、原型、原型链

6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性.对象上定义的属性默认值为true [[enumerable]] 表示能否通过for-in循环返回属性.直接在对象上定义的属性,它们的这个特性默认值为true [[writable]] 表示能否修改属性值.像前面例子中那样直接在对象上定义的属性,它们默认值为t

JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式

1.单例模式 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>面向对象之单例模式</title> 6 </head> 7 <body> 8 9 <script type="text/javascript"> 10 //对象数据类型

javascript--面向对象(二、工厂模式,构造函数,原型模式)

一.前言 上一篇介绍了对象的基本简单的概念和对象的数据属性和访问器属性,以及对这两种属性类型的一些操作,接来说一下与创建对象的模式. 二.创建对象的方式 (1)工厂模式 这种模式就是通过创建一个Object对象,并将属性和方法保存在Object对象中,将Object对象返回. function createPerson(name, age, job){ var obj = new Object();//通过创建Object来保存传递进来的属性 obj.name = name; obj.age =

js面向对象小结(工厂模式,构造函数,原型方法,继承)

最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型模式 4.继承 一.工厂模式 工厂模式中的函数中会创建一个对象,最后return这个对象,通过每次调用时传入的参数不同来解决创建多个相似对象的问题. // 工厂模式 function creatPerson(name, age, job) { var o = {}; o.name = name; o.age = age;

Activity中的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: [html] view plaincopy Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" 

JavaScript 面向对象 (prototype 原型模式)

一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力.比如,如果网页上有一栏"用户名"要求填写,浏览器就无法判断访问者是否真的填写了,只有让服务器端判断.如果没有填写,服务器端就返回错误,要求用户重新填写,这太浪费时间和服务器资源了. 因此,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师_Brend