js设计模式:工厂模式、构造函数模式、原型模式、混合模式

一、js面向对象程序

var o1 = new Object();

o1.name = "宾宾";

o1.sex = "男";

o1.age = "27";

o1.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

var o2 = new Object();

o2.name = "倩倩";

o2.sex = "女";

o2.age = "20";

o2.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

//调用对象下面方法

o1.msg();

o2.msg();

//思考:如何让代码复用。

//为了解决这个,引用一种设计模式:工厂模式。就是在函数内部创建一个对象,给对象赋予属性和方法,在将对象返回即可。

二、 工厂模式

//工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。

function Person(name,sex,age){

var o = new Object();

o.name = name;

o.sex = sex;

o.age = age;

o.getName = function () {

console.log(this.name);

}

o.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

return o;

}

var person1 = Person("彬彬","男","26");

//var myArray=new Array();

var person2 = Person("倩倩","女","26");

person1.msg();

person1.getName();

person2.msg();

//思考:我们创建的对象和系统对象有什么区别??

//为了解决这个:我们需要在外面new一个函数就可以了,这就引出了js另一种设计模式:构造函数模式

三、构造函数模式

//此模式特点:当new去调用一个函数,这个时候函数里面的this就是创建出来的对象,而且函数返回值直接就是this,这就叫隐式返回

function Person(name,sex,age){

this.name = name;

this.sex = sex;

this.age = age;

this.getName = function () {

console.log(this.name);

}

this.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

}

var person1 = new Person("彬彬1","男","26");

var person2 = new Person("倩倩1","女","26");

person1.msg();

person1.getName();

person2.msg();

console.log(person1.msg == person2.msg);//false

//思考:如何在提供性能??也就是让公用的属性和方法在内存中只存在一份??

//解决问题方法:这里用到js设计模式中另外一种模式:原型模式。就是将公用的属性和方法加载在原型上(prototype)。

四、js原型模式

//原型(prototype)要写在构造函数下面。

//原型相当于CSS中Class,普通方法和属性相当于标签元素里的style。所以原型的优先级要普通方法和属性。

function Person(){

}

Person.prototype.name = "彬彬";

Person.prototype.sex = "男";

Person.prototype.age = "10";

Person.prototype.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

var person1 = new Person();

person1.msg();

var person2 = new Person();

person2.name = "晃晃";

person2.msg();

//思考:这种修改属性比较麻烦???

//解决问题方法:把属性写在构造函数内,方法采用原型模式写,着就叫JS混合的模式

五、构造函数+原型的js混合的模式(推荐)

function Person(name,sex,age){

this.name = name;

this.sex = sex;

if(age){

this.age = age; //优先级高于原型

}

}

Person.prototype.age = 10;

Person.prototype.getName = function(){

console.log(this.name);

}

Person.prototype.msg = function(){

console.log("姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age);

}

var person1 = new Person("彬彬1","男",80);

var person2 = new Person("倩倩1","女");

person1.msg();

person1.getName();

person2.msg();

console.log(person1.msg == person2.msg);//true

时间: 2024-10-19 12:52:47

js设计模式:工厂模式、构造函数模式、原型模式、混合模式的相关文章

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

本文参考: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

设计模式之第9章-原型模式(Java实现)

设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧,大多数还是一样的,群发.”“就是就是,上次我收到一个,竟然连名字都给弄错了,简直没法说啊,要不然就不发得了,干嘛弄得那么麻烦.”“所以说,才会有群发的短信我不回这个段子嘛.”“对了,今天你不是就要讲那个原型模式什么的,就是类似于群发的是吧.”“嘿嘿,天机不可泄露.”(PS:还天机不可泄露,学会吊起胃

NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)

原型模式(Prototype Pattern) ——.NET设计模式系列之六 Terrylee,2006年1月 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype模式结构图 生活中的例子 Pr

.NET设计模式(6):原型模式(Prototype Pattern)(转)

概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype模式结构图 生活中的例子 Prototype模式使用原型实例指定创建对象的种类.新产品的原型通常是先于全部产品建立的,这样的原型是被动的,并不

"围观"设计模式(10)--创建型之原型模式(Prototype Pattern)

原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据.----WIKIPEDIA 首先看下面这样的一个例子,使用本人自黑一下,实现Clonable接口然后实现它的clone的方法,然后通过该方法对这个对象进行克隆.看是不是像我们

设计模式(六):原型模式

在读这个模式,头脑里就浮想两个问题: 1. JavaScript的原型模式与普遍的原型模式有什么区别? 2. JavaScript的原型模式与prototype有什么关系? 原型模式定义 原型模式(创建型设计模式)是用一个对象做模板,克隆出新对象. 另外原型模式中的克隆分为"浅克隆"和"深克隆": 浅克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象. 深克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象

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

具体可参考红皮书第三版中的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

《JAVA与模式》之原型模式(转载)

原型模式其实就是java的拷贝机制 原文出处:http://blog.csdn.net/zhengzhb/article/details/7393528   定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实

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

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

7中创建对象的方式(工厂模式、构造函数模式、原型模式、动态原型模式等分析)

1.工厂模式 // 定义工厂函数 function createPerson(name, age, hobby) { // 创建一个临时object对象 var obj = new Object(); // 将工厂函数的参数赋值给临时对象 obj.name = name; obj.age = age; obj.hobby = hobby; obj.sayName = function() { console.log("我的名字叫:"+this.name); } // 返回这个包装好的临