起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2094|回复: 0

[分享] js创建对象的方式

[复制链接]

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2014-9-21 15:27:48 | 显示全部楼层 |阅读模式
版本: 小版本号:
数据库: 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
本帖最后由 腹部流出的肉 于 2014-9-21 15:32 编辑

    共勉一下下
    1.传统的方式 var box = new Object();
    2.字面量的方式 var box = {};
    3.工厂模式(方法名小写、在内部显示地创建对象、返回对象)
    function box(name,age){
        var box = new Object();
        box.name = name;
        box.age = age;
        box.run = function(){
            return this.name + this.age + "运行中... ...";
        }
    }
    不能解决对象识别的问题
    4.构造函数模式(方法名大写、内部隐式地创建对象、不方法对象而是后台隐式地返回对象)
    function Box(name,age){
        this.name = name;
        this.age = age;
        this.run = function(){
            return this.name + this.age + "运行中... ...";
        }
    }
    能解决对象识别问题,不能解决共享问题
    5.原型模式
    function Box(){}
    Box.prototype.name = "bin.z";
    Box.protype.age = 22;
    Box.prototype.run = function(){
        return this.name + this.age + "运行中... ...";
    };
    解决了共享问题,可是出现了对象传参问题和数据共享问题
    6.组合构造函数 +  原型模式
    function Box(name,age){
        this.name = name;
        this.age = age;
    }
    Box.prototype = {
        constructor : Box,
        run : function(){
            return this.name + this.age + "运行中... ...";
        }
    }
    不够封装
    7.修改后的组合构造函数 + 原型模式(动态原型模式)
    function Box(name,age){
        //给实例对象添加属性或方法
        this.name = name;
        this.age = age;
        //添加方法
        //... ...
        //给类型原型对象添加属性或方法
        //添加属性
        //... ...
        Box.prototype.run = function(){
            return this.name + this.age + "运行中... ...";
        }   
    }
    8.组合构造函数模式 + 工厂模式 (构造函数模式寄生工厂模式、寄生模式、寄生构造模式)
    function Box(name,age){
        var box = new Object();
        box.name = name;
        box.age = age;
        box.run = function(){
            return this.name + this.age + "运行中... ...";
        };
        return box;
    }
    //寄生构造模式调用 Box(name,age) 或 new Box(name,age)
    9.稳妥构造函数(在不允许使用this[函数中不允许出现]和new[调用中不允许出现]的时候使用)
    function Box(name,age){
        var box = new Object();
        box.name = name;
        box.age = age;
        box.run = function(){
            return name + age + "运行中... ...";
        };
        return box;
    }
    如果调用使用了 new Box(name,age)就是稳妥构造函数模式,稳妥构造模式在调用的时候不使用new Box(name,age)
    不管是工厂模式、组合构造函数模式 + 工厂模式(寄生构造模式)、 稳妥构造模式(寄生构造模式的变化)都是不能解决对象识别问题的
    其实最最最常用的模式是字面量模式和组合构造函数模式 + 原型模式 ,还有就是动态原型模式了

特别解析一下8

/*

    1.通过内置引用类型添加属性或方法不太好,因这样可能会出现属性名和方法名重复的现象 不推荐使用
    2.可以通过工厂模式或组合构造函数+工厂模式(构造函数寄生工厂模式、寄生模式、寄生构造函数模式)
       工厂模式
       function extendType(){//可以传递参数
        var similarPrototype = new Type();//在工厂模式中创建的对象就像原型对象(因为这是为了替换Type.prototype.newFunction = function(){}),Type只是一种类型哟... ...
        similarPrototype.extendedFunctionName  = function(/*** 参数列表 ***/) {/*** 函数体 ***/}
        return similarPrototype;
       }
       组合构造函数 + 工厂模式
       function ExtendType(){
        var similarPrototype = new Type();
        similarPrototype.extendedFunctionName  = function(*** 参数列表 ***) {*** 函数体 ***}
        return similarPrototype;
       }
       //通过工厂模式或组合构造函数 + 工厂模式 解决了通过原型对象直接添加属性或方法对原型对象的破坏,而使用了一个类原型对象similarPrototype
       //来解决问题,但这种方式必直接通过原型对象添加属性或方法要慢很多... ...
      

*/

评分

参与人数 1 +5 收起 理由
jishuang + 5 赞一个!

查看全部评分

如果我说对了 请别忘记点赞.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-6 17:43 , Processed in 0.110292 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表