js中创建对象的几种方法

对象的组成
var obj=new Object();
obj.name="zjk1";
        obj.age=30;
obj.showName=function(){
    alert(this.name);
}
obj.showAge=function(){
    alert(this.age);
}
var obj1=new Object();
obj1.name="zjk1";
obj1.age=30;
obj1.showName=function(){
alert(this.name);
}
obj1.showAge=function(){
alert(this.age);
}
 
// 缺点:代码量繁多冗杂每次都要重复定义建议写成函数

工厂模式(关键字Object)
function person(name,age){
         var obj=new Object();//原料
obj.name=name;
obj.age=age;
obj.showName=function(){
alert(this.name);
}
obj.showAge=function(){
alert(this.age);
}//加工的过程
return obj;//成品
}
var obj2=person("zjk",30);
         var obj3=person("zjk1",30);
alert(obj2.showName==obj3.showName);//false
//缺点:1.构造函数的时候需要new

// 2.重复定义函数

可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象

    工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型


构造函数
function person(name,age){
this.name=name;
this.age=age;
this.showName=function(){
alert(this.name);
}
this.showAge=function(){
alert(this.age)
} //加工的过程
//return this; 系统会偷偷返回这个新建的this对象

}
var obj2=new person("zjk",29);
        var obj3=new person("zjk",29);

       //缺点:构造函数的时候是需要new的,每次new都会创建一个var this=new Object();会重复构造函数

没有显示的创建对象,使用new来调用这个构造函数,使用new后会自动执行如下操作

  • 创建一个新对象

  • 这个新对象会被执行[[prototype]]链接

  • 这个新对象会绑定到函数调用的this

  • 返回这个对象

  使用这个方式创建对象可以检测对象类型

  但是使用构造函数创建对象,每个方法都要在每个实例上重新创建一次


原型模式(prototype)
function Dog(){
}
Dog.prototype.name="旺财";
Dog.prototype.eat=function(){
alert(this.name);
}
var dd=new Dog();

dd.eat();

将信息直接添加到原型对象上。使用原型的好处是可以让所有的实例对象共享它所包含的属性和方法,不必在构造函数中定义对象实例信息。

缺点

  使用原型,所有的属性都将被共享,这是个很大的优点,同样会带来一些缺点

  原型中所有属性实例是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性也勉强可以,毕竟实例属性可以屏蔽原型属性。但是引用类型值,就会出现问题

function Person() {

}

Person.prototype = {

  name'jiang',

  friends['Shelby', 'Court']

}

var person1 = new Person()

var person2 = new Person()

person1.friends.push('Van')

console.log(person1.friends) //["Shelby", "Court", "Van"]

console.log(person2.friends) //["Shelby", "Court", "Van"]

console.log(person1.friends === person2.friends) // true

  friends存在与原型中,实例person1和person2指向同一个原型,person1修改了引用的数组,也会反应到实例person2中

混合的构造函数模型(最常用)

    这是使用最为广泛、认同度最高的一种创建自定义类型的方法。它可以解决上面那些模式的缺点

    使用此模式可以让每个实例都会有自己的一份实例属性副本,但同时又共享着对方法的引用

 这样的话,即使实例属性修改引用类型的值,也不会影响其他实例的属性值了

function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
return this.name;
}
Person.prototype.showAge=function(){
return this.age;
}
var obj1=new Person("zjk",30);
var obj2=new Person("zjk1",30);
alert(obj1.showName==obj2.showName);//true

//把重复定义的函数用原型构造


动态原型的方式(可以看作是混合模式的一种特例)

  function Car(name,price){  
        this.name=name;  
        this.price=price;   
        if(typeof Car.sell=="undefined"){  
           Car.prototype.sell=function(){  
             alert("我是"+this.name+",我现在卖"+this.price+"万元");  
           }  
           Car.sell=true;  
        }  
   }  
   var camry =new Car("凯美瑞",27);  
   camry.sell();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值