zoukankan      html  css  js  c++  java
  • 工厂模式、构造函数、闭包

    为了解决多个类似对象声明的问题,我们可以使用一种叫做工厂模式的方法,这种方法就是为了解决实例化对象产生大量重复的问题。

    function createObject(name, age) { //集中实例化的函数

    var obj = new Object();

    obj.name = name;

    obj.age = age;

    obj.run = function () {

    return this.name + this.age + '运行中...';

    };

    return obj;

    }

    var box1 = createObject('Lee', 100); //第一个实例

    var box2 = createObject('Jack', 200); //第二个实例

    alert(box1.run());

    alert(box2.run()); //保持独立

    工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,因为根本无法搞清楚他们到底是哪个对象的实例。

    alert(typeof box1); //Object

    alert(box1 instanceof Object); //true

    ECMAScript中可以采用构造函数(构造方法)可用来创建特定的对象。类型于Object对象。

    function Box(name, age) { //构造函数模式

    this.name = name;

    this.age = age;

    this.run = function () {

    return this.name + this.age + '运行中...';

    };

    }

    var box1 = new Box('Lee', 100); //new Box()即可

    var box2 = new Box('Jack', 200);

    alert(box1.run());

    alert(box1 instanceof Box); //很清晰的识别他从属于Box

    使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,但问题是,这里并没有new Object(),为什么可以实例化Box(),这个是哪里来的呢?

    使用了构造函数的方法,和使用工厂模式的方法他们不同之处如下:

    1.构造函数方法没有显示的创建对象(new Object()),但是后台会自动var obj = new Object()

    2.直接将属性和方法赋值给this对象;

    3.没有renturn语句,后台自动返回。

    构造函数的方法有一些规范

    1.函数名和实例化构造名相同且大写,(PS:非强制,但这么写有助于区分构造函数和普通函数)

    2.通过构造函数创建对象,必须使用new运算符。

    既然通过构造函数可以创建对象,那么这个对象是哪里来的,new Object()在什么地方执行了?执行的过程如下:

    1.当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object()

    2.将构造函数的作用域给新对象,(new Object()创建出的对象),而函数体内的this就代表new Object()出来的对象。

    3.执行构造函数内的代码;

    4.返回新对象(后台直接返回)

    构造函数和普通函数的唯一区别,就是他们调用的方式不同。只不过,构造函数也是函数,必须用new运算符来调用,否则就是普通函数。

    var box = new Box('Lee', 100); //构造模式调用

    alert(box.run());

    Box('Lee', 20); //普通模式调用,无效

    var o = new Object();

    Box.call(o, 'Jack', 200) //对象冒充调用

    alert(o.run());

    //通过表达式自我执行

    (function box() { //封装成表达式

    alert('Lee');

    })(); //()表示执行函数,并且传参

    闭包

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

    //通过闭包可以返回局部变量

    function box() {

    var user = 'Lee';

    return function () { //通过匿名函数返回box()局部变量

    return user;

    };

    }

    alert(box()()); //通过box()()来直接调用匿名函数返回值

    var b = box();

    alert(b()); //另一种调用匿名函数返回值

  • 相关阅读:
    科普下病菌和病毒
    centos环境下安装docker
    change master to到一个不存在的主库或主库无法连接
    java.lang.outofmemoryerror android
    委托 C#
    将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可
    combobox联动
    删除dataGridview中选中的一行或多行
    vs2010下如何使【“System.Data.OracleClient.OracleConnection”已过时】 解决办法
    MyEclipse连接SQL Server 2008数据库的操作方法
  • 原文地址:https://www.cnblogs.com/yangyang63963/p/5690499.html
Copyright © 2011-2022 走看看