zoukankan      html  css  js  c++  java
  • javascript 创建对象的7种模式

      

        使用字面量方式创建一个 student 对象:

    1 var student = function (){
    2         name : "redjoy",
    3         age : 21,
    4         sex: women,
    5         sayName: function(){
    6                  alert(this.name);
    7         }
    8 };

       使用Object.defineProperties() 方法给对象添加属性:(只有IE9+,FF4+,SF5+,OP 12+,Chrome支持)

     1 var student = {};
     2 Object.defineProperties( student,{
     3         name:{
     4             value: "redjoy"
     5         },
     6         age:{
     7             value: 21
     8         },
     9         _year:{
    10             value:2015
    11         },
    12         year:{
    13             get:function(){
    14                     return  this._year;
    15             },
    16             set:function(newValue){
    17                     if (newValue > 2015){
    18                             this._year = newValue;
    19                             this.age += newValue -1993;
    20                     }
    21              }
    22          }
    23 });

              当面对使用Object构造函数和对象字面量创建单个对象时,我们会因为使用同一个接口创建很多对象,产生大量的重复代码。所以,有了创建对象的七种模式:

          一、工厂模式(抽象了创建具体对象的过程)

     1 function createStudent(name,age,sex){
     2         var s = new Object();
     3         s.name = name ;
     4         s.age = age ;
     5         s.sex = sex;
     6         s.sayName = function (){
     7                 console.log(this.name);
     8         };
     9         return s;
    10 }
    11 
    12 var student1 = createStudent("redjoy",21,"women");
    13 var student2 = createStudent("jonny",23,"man");

          二、构造函数模式

          重写上面的例子:

     1 function Student( name,age,sex){
     2         this.name = name;
     3         this.age = age;
     4         this.sex = sex;
     5         this.sayName = function() {
     6                 console.log(this.name);
     7         };
     8 }
     9 
    10 var student1 = new Student("redjoy",21,"women");
    11 var student2 = new Student("jonny",23,"man");

       与工厂模式相比,构造函数模式可以将它的实例标示为一种特定的类型。

           

          三、原型模式

     1 function Student(){
     2 }//构造函数
     3 
     4 Student.prototype = {
     5         name :"redjoy",
     6         age : 21,
     7         sex : "women",
     8         sayName : function(){
     9                 console.log(this.name);
    10         }
    11 };
    12 
    13 var student1 = new Student();
    14 var student2 = new Student();

        四、组合使用构造函数模式和原型模式(最常见的方式)

        优点:构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。

      

     1 function Student(name ,age ,sex ){
     2         this.name = name ;
     3         this.age = age ;
     4         this.sex = sex;
     5 }//在构造函数里定义实例属性
     6 
     7 Student.prototype = {
     8         constructor : Student,
     9         sayName : funtion(){
    10                 console.log(this.name);
    11         }   
    12 }//在原型中定义constructor属性和sayName()方法
    13 
    14 
    15 var student1 = new Student("redjoy",21,"women");
    16 var student2 = new Student("jonny",23,"man");
    17 
    18 console.log(student1.sayName === student2.sayName);//true

        五、动态原型模式

        优点:把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),同时还保持了构造函数和原型的优点。

     1 function Student(name , age ,sex ){
     2            //属性
     3            this.name = name;
     4            this.age = age;
     5            this.sex = sex;
     6            //方法
     7            if (typeof this.sayName != "function"){
     8                 Student.prototype.sayName = function(){
     9                             console.log(this.name);
    10                 };
    11             }
    12 }
    13 var student = new Student("redjoy",21,"women");
    14 student.sayName();

         注意:在使用动态原型模式时,不能使用对象字面量重写原型。

         六、寄生构造函数模式

     1 function Student(name , age,sex){
     2         var s = new Object();
     3         s.name = name;
     4         s.age = age;
     5         s.sex = sex;
     6         s.sayName = function(){
     7                 console.log(this.name);
     8         };
     9         return s;
    10 }
    11 
    12 var student = new Student("redjoy",21,"women");
    13 student.sayName();//"redjoy"

         

         七、稳妥构造函数模式

         稳妥对象:指的是没有公告属性,而且其方法也不引用this的对象。

         与寄生构造函数模式类似,但存在两点不同:

        1. 新创建对象的实例方法不用this

        2. 不是要new 操作符调用构造函数

        重写上面的例子:

     1 function Student( name, age ,sex ){
     2         //创建要返回的对象
     3         var s = new Object();
     4         //可以在这里定义私有变量和函数与上面类似
     5         //添加方法
     6         s.sayName = function(){
     7                 console.log(name);
     8         };
     9 
    10         //返回对象
    11         return s;
    12 }

      可根据每个创建对象的模式来选择适合自己的方法,创建对象

    (以上作为自己的个人笔记,参考来源于 javascript高级程序设计 第三版)

        

        

  • 相关阅读:
    Python 字符串
    python 元组用法
    python 字典用法
    环境配置
    桥式整流以及电容作用
    三角序列的正交性
    MDS
    ISOMAP
    randperm
    数据库~Mysql里的Explain说明
  • 原文地址:https://www.cnblogs.com/redjoy/p/4688806.html
Copyright © 2011-2022 走看看