Javascript理解面向对象(一)--对象创建模式

1)工厂模式 

  通俗来讲就是把原料进厂加工后出厂的一系列流程。在这里只是把原料换成了数据。

  以下代码创建了一个createPerson()函数,函数中存在两个属性一个方法,可用于添加并打印person的姓名和年龄信息。

 

    <script>
        function createPerson(name, age) {
            //1:原料
            var obj = new Object();
            //2:加工
            obj.name = name;
            obj.age = age;
            obj.showInfo = function () {
                alert(this.name + ‘,‘ + this.age);
            };
            //3:出厂
            return obj;
        }
        var p1 = createPerson(‘leo‘, 22);
        var p2 = createPerson(‘su‘, 37);
        p1.showInfo();  //leo,22
        p2.showInfo();  //su,37

        alert(p1.showInfo == p2.showInfo); //false
    </script>

  这种工厂模式是比较原始的一种对象创建模式,其中存在两种比较明显的缺陷。

  缺陷一:无法识别对象类型 也就是没有new的过程

  缺陷二:每个对象都需要创建一个showInfo() 方法造成了资源浪费

2)构造函数模式

  Js中的构造函数可用来创建特定类型的对象。像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境里。 

 此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。使用构造函数模式重写前面的例子。
    <script>
        function createPerson(name, age) {
            //系统内部自动创建this对象
            //var this = new Object();

            //2:加工
            this.name = name;
            this.age = age;
            this.showInfo = function () {
                alert(this.name + ‘,‘ + this.age);
            };
            //系统自动返回对象
            //return this;
        }
        var p1 = new createPerson(‘leo‘, 22);
        var p2 = new createPerson(‘su‘, 37);
        p1.showInfo();  //leo,22
        p2.showInfo();  //su,37
    </script>

  

  当前模式解决了工厂模式存在的第一个缺陷,但第二个缺陷仍然存在。在这个模式下alert(p1.showInfo==p2.showInfo),结果仍然是false.

  每个方法都要在每个对象实例上重新创建一遍,但本质上这些方法是相同的。

3)原型模式

  关于原型对象不做深入探讨,以后再讲它的工作原理。现在只需要知道使用原型对象的好处是可以让所有对象实例共享他所包含的属性和方法。

  看一个Array对象的例子。给数组对象实现一个sum求和方法。

    <script>
        // Array类 本身不具备实际功能 只能用来构造对象
        // arr对象 本身具备实际功能 是被类创造出的

        var arr1 = new Array(1, 3, 5, 7);
        var arr2 = new Array(1, 2, 5);

        arr1.sum = function () {
            var result = 0;
            for (var i = 0; i < this.length; i++) {
                result += this[i];
            }
            return result;
        };
        alert(arr1.sum()); //16
        alert(arr2.sum()); //弹出错误
    </script>

  

  alert(arr2.sum());这条语句很明显会弹出错误,因为我并没有创建arr2.sum方法,创建的是arr1.sum()。

  如果要实现对arr2对象数组的求和,那就要再把求和函数赋值给arr2.sum。这样既麻烦又浪费了系统资源。

  我们用prototype原型对象模式来重写一下。

    <script>
        var arr1 = new Array(1, 3, 5, 7);
        var arr2 = new Array(1, 2, 5);

        //可用于扩展系统函数功能
        Array.prototype.sum = function () {
            var result = 0;
            for (var i = 0; i < this.length; i++) {
                result += this[i];
            }
            return result;
        };
        alert(arr1.sum == arr2.sum); //true
        alert(arr1.sum()); //16
        alert(arr2.sum()); //8
    </script>

  

  这样就用prototype模式为Array对象增加了一个新方法sum(),它的性质和数组原本的pop()、push()、sort()等方法是一样的。每个对象都可以使用它。

  现在再来看一下最开始的例子。我用prototype模式重写了它。

    <script>
        //相同的东西加在原型里 不同的东西加在构造函数里
        //首字母大写以区别构造函数和普通函数
        function CreatePerson(name, age) {
            //属性:每个对象各不相同   过程、动态
            this.name = name;
            this.age = age;
        }

        //方法:所有对象都一样  状态、静态
        CreatePerson.prototype.showInfo = function () {
                alert(this.name + ‘,‘ + this.age);
        };

        var p1 = new CreatePerson(‘leo‘, 22);
        var p2 = new CreatePerson(‘su‘, 37);
        alert(p1.showInfo==p2.showInfo)  //true
        p1.showInfo();  //leo,22
        p2.showInfo();  //su,37
    </script>

  

  上例正确打印出了person信息,并打印出两个对象实例的方法是相同的。

  由此,我们在实际项目中可以为系统函数增加新的方法以扩展功能满足需求并节省资源。也可在自己构造的函数中增加原型方法使实例共享以节省资源。

时间: 2024-10-06 11:56:44

Javascript理解面向对象(一)--对象创建模式的相关文章

深入理解JavaScript系列(47):对象创建模式(上篇)

介绍 本篇主要是介绍创建对象方面的模式,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式1:命名空间(namespace) 命名空间可以减少全局命名所需的数量,避免命名冲突或过度.一般我们在进行对象层级定义的时候,经常是这样的: var app = app || {}; app.moduleA = app.moduleA || {}; app.moduleA.subModule = app.moduleA.subModule || {}; app.moduleA.subMod

深入理解JavaScript系列(48):对象创建模式(下篇)

介绍 本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式6:函数语法糖 函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用prototype的特性,代码比较简单,我们先来看一下实现代码: if (typeof Function.prototype.method !== "function") { Function.prototype.method = function (name, implementation)

C++设计模式 之 “对象创建”模式:Factory Method

part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Factory Method Abstract Factory Prototype Builder Part 1 Factory Method 工厂方法 动机(Motivation) 在软件系统中,经常面临着创建对象的工作:由于需求的变化,需要创建的对象的具体类型经常变化. 如何应对这种变化?如何绕过常规的

设计模式之:对象创建模式

通过 对象创建 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型的模式: Factory Method 工厂方法模式 Abstract Factory 抽象工厂模式 Prototype  原型模式 Builder 构建器 一,.Factory Method 1,出现原因 在软件系统中,经常面临创建对象的工作.由于需求的变化,需要创建的对象的具体类型经常变化. 如何解决? 绕过常规的对象创建方法(new),提供

JavaScript基础对象创建模式之命名空间(Namespace)模式(022)

JavaScript中的创建对象的基本方法有字面声明(Object Literal)和构造函数两种,但JavaScript并没有特别的语法来表示如命名空间.模块.包.私有属性.静态属性等等面向对象程序设计中的概 念.为了让JavaScript实现面向对象程序中的高级语义,人们发明了命名空间模式.依赖声明模式,模块模式,以及沙盘模式. 1. 命名空间模式 命 名空间模式解决了JavaScript中的两个问题,一是全局变量污染的问题,二是可能的名字冲突问题.虽然JavaScript没有特别支持命名空

JavaScript基础对象创建模式之单体/单例模式(Singleton)

首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大概是这个样子: class Singleton { //私有,静态的类自身实例 private static Singleton instance = new Singleton(); //私有的构造子(构造器,构造函数,构造方法) private Singleton(){} //公开,静态的工厂方

浅谈Javascript中面向对象之对象

一.对象 1.1创建对象 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.一个简单的对象创建: var People = { name : "eavan", age : 24, getName : function(){ alert(this.name); //eavan } } 使用的时候就可以用People.name,获取People这个对象的name属性,或者是People.getName()来得到People的name值.另一

设计模式---对象创建模式之构建器模式(Builder)

一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 对象的创建:Builder模式是为对象的创建而设计的模式 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法. 二:动机 在软件

设计模式---对象创建模式之抽象工厂模式(Abstract Factory)

一:概念 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 二:动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合. 三:和工厂方法模式区别 工厂模式只能生产一个产品 抽象工厂可以一次