zoukankan      html  css  js  c++  java
  • JavaScript中对象的定义方式

    在JavaScript中是没有类的概念的,只有对象。无论是字符串,数值,数组还是函数,其本质都是对象。此外,JavaScript是允许自定义对象。什么是对象呢?简而言之,对象是带有属性和方法的特殊数据类型。以下是几种常用的对象定义方式。

    1、基于已有对象扩充其属性和方法

    简单的创建一个对象,然后动态地为其增加属性和方法。

    var object=new Object();
    object.name="zhangsan";
    object.sayName=function()
    {
        this.name=name;
     }
    object.sayName("lisi");  
    2、工厂方法

    工厂方式的优点在于你不需要每次扩充方法和属性,一次建成后就可以产生多个对象,无需关注创建细节,甚至不需要关注具体类的类名。

    function factory()
    {
        var object = new Object();
        object.username = "zhangsan";
        object.password = "123";
     
        object.get = function()
        {
            return (this.username+","+this.password);
        }
        return object;
    }
    var object1 = factory();     
    object1.get();

    好的对象创建方式应该满足方法可以被多个对象共享,而属性私有,使代码更加简略。同时,也可以将上述的程序改写为带参数的工厂创建方式。改进后的代码如下:

    function get(){
        return (this.username+","+this.password);
    }
     
    function factory(username,password){
        var object = new Object();
        object.username = username;
        object.password = password;
     
        object.get = get;
        return object;
    }
     
    var object1 = factory("zhangsan","123");
    object1.get();
    var object2 = factory("lisi","456");
    3、构造函数方式

    使用构造函数方式时,JavaScript引擎会在第一行代码执行前为我们生成一个对象,同时含有一个隐藏的return语句,将生成的对象返回。因此,在函数体内,无需显性地声明。

    function Person(){
        //在执行第一行代码前,js自动生成一个对象
        this.username = "zhangsan";
        this.password = "123";
     
        this.get = function(){
            return (this.username+","+this.password);
        }
        //隐藏的return语句,将生成的对象返回
    }
     
    var person = new Person();
    person.get();

    同理,也可以将其改为可传递参数的构造函数。

    4、使用原型(prototype)方式

    单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

    function Person()
    {
    }
     
    Person.prototype.username = "zhangsan";
    Person.prototype.password = "123";
    person.prototype.get = function(){
        return (this.username+","+this.password);
    }
     
    var person = new Person();
    person.username = "lisi";
    person.password = "456";
    person.get();

    如果使用原型方式对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。可以使用原型+构造函数方式来解决这个问题,使对象之间的属性互不干扰,各个对象间共享同一个方法。这也是推荐使用的方法。

    function Person()
    {
        this.username = new Array();
        this.password = "";
    }
     
    Person.prototype.get = function()
    {
        return (this.username+","+this.password);
    }
     
    var p1 = new Person();
    var p2 = new Person();
     
    p1.username.push("zhangsan");
    p1.password = "123";
     
    p2.username.push("lisi");
    p2.password = "456";
     
    p1.get();
    p2.get();
    5、动态原型方式

    在构造函数中,通过标志量让所有对象共享一个方法,而每个对象都拥有自己的属性。

    function Person()
    {
        this.username = "zhangsan";
        this.password = "123";
     
        if(typeof Person.flag == "undefined")
        {
            Person.prototype.get = function()
            {
                return (this.username+","+this.password);
             }
            Person.flag = true;
        }
    }
    var p1 = new Person();
    var p2 = new Person();
    p1.get();
    p2.get();
    结言

    以上为个人学习过程中的总结,若有更好的方法或者其他的理解,欢迎留言或者私信探讨。

  • 相关阅读:
    用于图片处理的10个超级jQuery插件
    [VS2010].NET4.0环境下使用.NET2.0程序集,出现“混合模式程序集异常”
    对企业虚拟化应用的一些感受[原创]
    留学生不回国:中国物价超美国 没车没房没尊严!
    Research Assembly Setting!
    [转] 微软的软件测试方法(附读后感)
    应用 ZedGraph
    [转] LOGIGEAR SECURITY POLICIES
    一道程序运行结果题
    VS05 与 VS08并存时编译出现 The binding handle is invalid.
  • 原文地址:https://www.cnblogs.com/pwindy/p/12643673.html
Copyright © 2011-2022 走看看