Javascript 中创建自定义对象的方法汇总


Posted in Javascript onDecember 04, 2014

Javascript 中创建对象,可以有很多种方法。

Object构造函数/对象字面量

抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性.

     var student = new Object();

     student.name = "xiao ming";

     student.age = 20;

     student.getName = function () {

         alert(this.name);

     }

熟悉javascript 对象字面量的同学,可以换一种更好的写法,至少看上去更简洁。
    var student = {

        name: "xiao hong",

        age: 18,

        getName: function () {

            alert(this.name);

        }

    };

 缺点:上面方法有个缺点就是,使用同一个接口创建很多类似的对象时,会产生大量重复的代码。这个应该很容易理解了,函数(方法或者类)一般是用来创建公共的方法,上面的对象创建过程,根本没有函数的影子,所以谈不上什么重用。

工厂模式

工厂模式 抽象了具体创建对象的过程。就像一个黑盒,你只要调用函数(进入工厂),并且传入相应参数(各种原材料),就会出来一个相应的对象(工厂生产的产品)。工厂模式解决了创建多个相似对象的问题。

     function studentFactory(name,age) {

         var student = new Object();

         student.name = name;

         student.age = age;

         student.sayName = function () {

             alert(this.name);

         }

         return student;

     }

     var p1 = studentFactory("ming", 20);

     var p2 = studentFactory("hong", 18);

缺点:工厂模式也有缺点,最大的缺点就是 对象类型识别的问题。只能判断出对象是Object 类型(p1 instanceof Object),而无法具体判断出来是哪种类型。使用工厂模式创建出来的student 其实都有着类似的属性和方法,只是值不同而已。这时 更好的解决方法是,创建一个Student 函数,这样所有的对象都属于 Student 类型。所以工厂模式不是不好,只是 构造函数模式更优。

自定义类型的构造函数:

构造函数可以用来创建特定类型的对象。

     function Student(name,age) {

         this.name = name;

         this.age = age;

         this.sayName = function () {

             alert(this.name);

         }

     }

     var p3 = new Student("ming", 20);

     var p4 = new Student("hong", 18);

     alert(p3 instanceof Student); 

alert(p3.sayName==p4.sayName); //false

缺点:自定义构造函数 的不足之处就是,每个对象都会重新创建自己的方法,其实这些方法功能是一样的(像 sayName),但是它们却不相同(p3.sayName 和p4.sayName不相等)。

原型模式:

定义一个空函数,然后把所有属性和方法都添加到原型上,这样所有的 对象都会共用这些属性和方法。

     function Student() {};

     Student.prototype.name = "ming";

     Student.prototype.age = 20;

     Student.prototype.friends = ['qi'];

     Student.prototype.sayName = function () {

         alert(this.name);

     };

缺点:有些属性不能共享,共享回来带来问题,例如:friends。每位同学的friends 大多都不会相同。

构造函数与原型的组合:

     function Student(name, age, friends) {

         this.name = name;

         this.age = age;

         this.friends = friends;

     }

     Student.prototype = {

         constructor: Student,

         sayName: function () {

             alert(this.name);

         }

     };

总结:构造函数与原型的组合 是一种获得广泛认可的创建自定义类型的方法。 也是上面这些方法中的最优方法。

/*************************************************************************************************************/

其实上面的创建对象的方法已经很多了,但是还是有可能出现一些比较特殊的场景,需要继续的优化。

动态原型模式:

它是构造函数与原型组合 的一种优化。对于那些共用的属性和方法,如果初始化之后,就不必再重复初始化,提高效率。

       function Student(name, age) {

           this.name = name;

           this.age = age;

           if ((typeof this.sayName) != "function") {

               Student.prototype.sayName = function () {

                   alert(this.name);

               }

           }

       }

       var stu = new Person("ming", 20);

       //alert(stu instanceof Student);

       stu.sayName();


var stuNew = new Person("hong", 18);



//alert(stuNew instanceof Student);



stuNew.sayName();

当创建多个student对象时,sayName 方法只会初始化一次。

最后还有一种很有用的创建对象的方式,就是稳妥构造函数。

稳妥构造函数模式:

在这个模式中会禁止使用this和new,所有对象没有公共的属性。只能读取变量的值,而不能修改。

      ////稳妥构造函数模式

      function Student(name, age) {

          var o = new Object();

          o.sayName = function () {

              alert(name);

          }

          return o;

      }

      var stu = Student("ming", 21);

      stu.sayName();

以上汇总了几种常见的Javascript创建自定义对象的方法,非常的全面,大家如有更好的,请联系我,本文持续更新。

Javascript 相关文章推荐
jQuery 前的按键判断代码
Mar 19 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
Feb 26 Javascript
js获取ajax返回值代码
Apr 30 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
jquery+css3打造一款ajax分页插件(自写)
Jun 18 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
Dec 26 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
Jul 07 Javascript
实例讲解JavaScript 计时事件
Jul 04 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 Javascript
js实现鼠标切换图片(无定时器)
Jan 27 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 #Javascript
jquery实现动态画圆
Dec 04 #Javascript
javascript数组遍历for与for in区别详解
Dec 04 #Javascript
c#+jquery实现获取radio和checkbox的值
Sep 12 #Javascript
express的中间件cookieParser详解
Dec 04 #Javascript
express的中间件bodyParser详解
Dec 04 #Javascript
express的中间件basicAuth详解
Dec 04 #Javascript
You might like
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
Javascript函数的参数
2015/07/16 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
从vue源码看props的用法
2019/01/09 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python二叉树的实现实例
2013/11/21 Python
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
差生评语大全
2014/05/04 职场文书
企业整改报告范文
2014/11/08 职场文书