js 创建对象的几种方式

来源:互联网 发布:淘宝是日本的 编辑:程序博客网 时间:2024/06/14 10:10

第一种:工厂模式
例1:

function createObj(name,age){    var o=new Object();    o.name=name;    o.age=age;    o.sayInfo=function(){        console.log(per1.name+"的年龄是:"+per1.age);    }    return o;}       var per1=createObj("张三",20);per1.sayInfo();

缺点:无法知道对象的类型

第二种:构造函数模式
例2:

function Person(name,age){    this.name=name;    this.age=age;    this.sayInfo=function(){        console.log(this.name+"的年龄是:"+this.age);    }}var per2=new Person("李四",30);per2.sayInfo(); 

缺点:每个方法都要在每个实例上重新创建一遍

第三种:原型模式
例3:

function Person(){}Person.prototype.name="王五";Person.prototype.age=40;Person.prototype.sayInfo=function(){    console.log(this.name+"的年龄是:"+this.age);}var per3=new Person();per3.sayInfo();

例3基础上,修改为更简单的原型模式
例4:

function Person(){}Person.prototype={    name:'王五',//注:'='改为':'    age:40,    sayInfo:function(){        console.log(this.name+"的年龄是:"+this.age);    }}var per3=new Person();per3.sayInfo();

使用原型模式的缺点样例
例5:

function Person(){}Person.prototype={    name:"赵六",    friends:["张三","李四"],    sayInfo:function(){        console.log(this.name+"的朋友有:"+this.friends);    }}var per4=new Person();var per5=new Person();per4.friends.push("王五");console.log(per4.friends);//输出: ["张三", "李四", "王五"]console.log(per5.friends);//输出: ["张三", "李四", "王五"]

缺点:per4与per5指向同一原型,per4修改了引用的数组,per5也随之改变

第四种:组合使用构造函数模式和原型模式
例6:

function Person(name,friends){    this.name="赵六";    this.friends=["张三","李四"];}Person.prototype.sayInfo=function(){    console.log(this.name+"的朋友有:"+this.friends);}var per6=new Person();var per7=new Person();per6.friends.push("王五");per6.sayInfo();//输出:赵六的朋友有:张三,李四,王五per7.sayInfo();//输出:赵六的朋友有:张三,李四