您的位置:首页 > Web前端 > JavaScript

JavaScript中创建对象的几种模式

2017-02-24 15:26 288 查看

JavaScript中创建对象的几种模式

一:Object构造函数或对象字面量创建单个对象

    Object构造函数: var peopel = new Object();

                                  peopel.name="Tom";

      对象字面量:      var people={

                                        name : "Tom"             

                                  };

     缺点:使用同一个接口创建多个对象,会产生大量的重复代码.

二:工厂模式

     考虑到ESMAScript中无法创建类,开发人员发明了一种函数,用函数来封装以特定接口创建对象的细节

      function People(name){

                 var o = new Object();

                 o.name = name;

                 return o;

      }

      var person1 = new People("Tom");

     优点:解决了多个相似对象的问题.

     缺点:没有解决对象识别的问题(怎么知道一个对象的类型);

三:构造函数模式

      

     function People(name){

                 this.name = name;

      }

      var person1 = new People("Tom");

      优点:创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型.

               alert(person1  instanceof  People); //true

      缺点:每个方法都要在实例上重新创建一遍,但可以通过把函数定义转移到构造函数外部来解决此问题.

               function Person(name){

                      this.name = name;

                      this.sayName = new Function("alert(this.name)");

                }

                 var person1 = new People("Tom");

                 var person2 = new People("Bob");

                 alert(person1.sayName==person2.sayName);  //false

                 这里创建两个完成相同任务的Function实例确实没有必要,所以可以这样写:

                 

                 function Person(name){

                      this.name = name;

                     this.sayName = sayName;

                }

               function sayName(name){

                     alert(this.name);

                }

                但是这样做,全局作用域中定义的函数实际上只能被某个对象调用,让全局作用域有点名不副实;如果需要定义很多方法,那么就需要定义很多全局函数,于是自定义的引用                   类型就丝毫没有包装性可言,好在这些问题可以通过原型模式来解决.
四:原型模式

     与构造函数不同的是:新对象的这些属性和方法是由所以实例所共享的.

     function  Person(){};

     Person.prototype.name="Tom";

     var person1 = new Person();

     alert(person1.name);  //Tom

五:组合使用构造函数模式和原型模式

     构造函数用于定义实例属性;原型模式用于定义方法和共享的属性,这种方式是用来定义引用类型的一种默认模式.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息