创建对象的几种方式

2019-06-18  本文已影响0人  Doki_455c

字面量创建对象

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())        //李四在睡觉
上一篇下一篇

猜你喜欢

热点阅读