美文网首页
创建对象的几种方式

创建对象的几种方式

作者: Doki_455c | 来源:发表于2019-06-18 13:22 被阅读0次

    字面量创建对象

    var obj = {
          name: '王五',                 //属性
          study: function () {            //方法
               return this.name+"学习中"       //this指向的是方法调用者
        }
    }
       obj.study()           //方法调用        
    

    new Object() 创建对象

    var obj1 = new  Object()
        obj1.name = '张三',
        obj1 : function () {
          return "学习中"
        }
    //缺点:创建多个同类对象时,代码会重复 
    

    工厂模式

     function info (name,age) {
            var obj = new Object()
            this.name = name   
            this.age = age
             return obj
    }
      var obj1 = info('李四',20)            //函数调用
      var obj2 = info('王五',22)
    console.log(obj1.name, obj1.age)     
    console.log(obj2.name, obj2.age)   //通过传递参数输出不同的值,解决了多个同类对象创建时代码重复的问题
    缺点:1、一般对象都是通过new关键字创建,工厂模式只是通过函数调用的方式 
         2、使用 instanceof不能确定某个对象属于哪一个类  
        console.log(obj1 instanceof Object)     //true
        console.log(obj2 instanceof Object)      //true
    

    构造函数

     //写在构造函数内部的属性  叫做实例属性  方法叫做 实例方法
      function Info (name) {                 //大驼峰命名
        this.name = name                 // 构造函数内的this指向通过构造函数new出来的对象          
        this.sleep = function () {
               return  this.name + '睡觉'
        }                                
        
      }
    //第一个对象
    var  obj1 = new Info('我是第一个' )
    //第二个对象
    var obj2 = new Info('我是第二个')
    //优点 : 对象创建方式规范,是通过new关键字创建的能确定某个对象属于哪一个构造函数(类)
    function Info1(name) {
        this.name = name    
    }
    function Info2(name) {
      this.name = name  
    }
    var a1 = new Info1('第一个')
    var a2 = new Info2('第二个')
    console.log( a1 instanceof Info1)       //返回true
    console.log( a1 instanceof Info1)        //返回false
    //缺点 :  多个同类对象被创建时,相同的方法会被重复创建, 占用内存空间不共享
    

    原型

    //将属性和方法写在构造函数的外面
    function Info () {
      
    }
    Info.prototype.name = '我是原型属性'         //原型属性 
    Info.prototype.sleep = function () {              //原型方法
               return '在睡觉'                     
        } 
    var  obj1 = new Info()  
    console.log(obj1.name, obj1.sleep()) //输出'我是原型属性',我是原型方法 
     //优点 : 多个同类对象的相同方法是共享的  不会被重建 
    //缺点 :  所有对象的属性名都相同                      
    

    混合

    /* 将属性写成实例属性
    将方法写成原型方法
    解决了上面创建对象时遇到的所有的缺点 */
    function Info(name) {
        this.name = name         //实例属性   
      }
    Info.prototype.sleep = function () {              //原型方法
               return this.name + '在睡觉'               //this的指向方法的调用者     
        } 
    var a1 = new Info('张三')
    var a2 = new Info('李四')
    console.log(a1.sleep())         //张三在睡觉
    console.log(a2.sleep())        //李四在睡觉
    

    相关文章

      网友评论

          本文标题:创建对象的几种方式

          本文链接:https://www.haomeiwen.com/subject/wtwafctx.html