• Javascript中的对象和原型(二)(转载)


    上一篇中提到了JavaScript中对象的创建的一些基本操作,接下来讨论下继续讨论。

    一 工厂模式

    我们知道,要创建一个对象我们可以用如下代码:

    var user = new Object(); //使用new运算符创建一个对象 
    user.name = '念在三角湖畔'; //给对象添加属性
    user.age = 22;
    user.address
    = '湖北武汉';
    alert(user.name
    + " " +user.age);//返回 '念在三角湖畔 湖北武汉'

    用这样的方法创建对象比较简单直观,也是JavaScript种创建对象最基本的方法。但是这样就有一个问题,如果我们需要创建多个对象,那么我就 得写很多重复的代码。比如我们想创建另一个对象user1,我们就得重新将上面的代码重新写一遍,这在实际开发过程中是不合适的,这样如果对象过多,代码 量将大大增加。

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

     
    function create(name, age) 
    {
      
    var
    obj = new Object();   
    obj.name
    = name;   
    obj.age
    = age;   
    obj.run
    = function () {     
    return
    this.name +' '+ this.age;   
    };   

    return
    obj;
     }
    var obj1= create('ZXC', 10); //第一个实例
    var
    obj2= create('CXZ', 20); //第二个实例
    alert(obj1.run());
    alert(obj1.run());

    从上面的代码我们可以看出,工厂模式解决了实例化时代码大量重复的问题,但又出现了一个问题,那就是识别问题,我们根本无法弄清楚他们到底是哪个对象的实例。比如

    alert(typeof obj1);          //Object

    alert(obj1 instanceof Object);  //true

    以上代码标明box1是Object对象,但是我们无法知道具体是哪一个对象创建的。

    二 构造函数(构造方法)

    为了解决上面的问题,我们可以用构造方法去创建对象。构造函数和普通函数的唯一区别,就是调用的方式不同。但是,构造函数同样是函 数。

     
    function User(name, age) {   
    //构造函数模式   
    this.name = name;   
    this.age = age;   
    this.run = function () {     
    return this.name + ' '+this.age;
      }; 
    }
     

    创建对象的时候用new运算符就可以了:

    var user1= new User('ZXC', 25);

    var user2= new User('CXZ', 22);

    现在我们就可以检测user1或者user2是不是属于User。

    alert(user1 instanceof User);//true

    可见,使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题。

    使用构造函数时执行的过程如下:

    1.执行 new  构造函数()时,后台执行了 new Object();

    2.将构造函数的作用域给新对象。

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

    4.后台直接返回新对象。

     

    接下来我们看看构造函数内部的函数问题。如果我们执行以下语句:

    alert(user1.run==user2.run);//结果返回的是false

    结果返回的是false,这就说明方法其实也是一种引用地址。如果我们同样重复创建了多个对象,那么每个对象中的方法都会在内存中开辟新的空间,这样浪费的空间就比较多。要解决这个问题,我们就需要用到实例属性或者方法的共享,下一篇文章中将继续探讨解决这个问题。

     

    三 总结

    这里主要是讨论了重复创建实例是代码大量重复的问题以及构造函数的一些基本知识,高手可以路过,O(∩_∩)O~。有什么不妥之处欢迎指正!

  • 相关阅读:
    jQuery 对象 等操作
    根据文件大小自动判断单位B,KB,MB,GB
    PHP 根据子ID递归获取父级ID,实现逐级分类导航效果
    JQuery 目录树jsTree插件用法
    关于循环列表中包含递归函数的问题
    PHP文件上传大小限制问题
    UEditor+七牛,实现图片直连上传
    修改Ueditor的图片上传地址
    Thinkphp3.2.3加载外部类并调用类里面的方法 获取token
    七牛云--开发笔记
  • 原文地址:https://www.cnblogs.com/sandea/p/3293687.html
Copyright © 2020-2023  润新知