js 创建对象的5种常见模式

1、工厂模式
定义:以函数来封装以特定接口创建对象的细节,其实就是通过函数来创建一个对象并返回。
缺点:每次调用都会返回一个对象,不能节省内存,同时对象实例无法获取其对象类型。

function createPerson(name,age,job){
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function(){
        alert(this.name);
    };
    return o;
}
var person1=createPerson("张三",25,"搬砖");
var person2=createPerson("李四",30,"甩锅");

2、构造函数模式
定义:使用构造函数来创建特定类型的对象,通过new关键词来实例化。
缺点:每次调用都会返回一个对象,不能节省内存。但是能将实例标示为一种特定的类型,
例如:alert(person2 instanceof Person); //true

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName=function(){
        alert(this.name);
    };
}
var person1=new Person("张三",25,"搬砖");
var person2=new Person("李四",30,"甩锅");

3、原型模式
定义:每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,将实例的属性和方法写在构造
函数的prototype上,通过new来实例化。
优点:对象实例共享它所包含的属性和方法。
缺点:缺点即是优点,最大的问题就是其共享性,实例可以修改构造函数prototype属性值,影响其它实例。

function Person(){
}
Person.prototype={
    construct:Person,
    name:"张三",
    age:25,
    job:"搬砖",
    friends:["李五","赵六"],
    sayName:function(){
        alert(this.name);
    }
}
var person1=new Person();
var person2=new Person();
var person1.friends.push("陈七");
alert(person2.friends); // "李五,赵六,陈七"

4、构造函数模式+原型模式
定义:构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,每个实例都会有自己的一份实
例属性的副本,但是同时又共享着对方法的引用,最大限度的节省了内存。
优点:灵活、节省内存,是最广泛、认同度最高的一种创建自定义类型的方法。

function Person(){
}
Person.prototype={
    construct:Person,
    name:"张三",
    age:25,
    job:"搬砖",
    friends:["李五","赵六"],
    sayName:function(){
        alert(this.name);
    }
}
var person1=new Person();
var person2=new Person();
var person1.friends.push("陈七");
alert(person2.friends); // "李五,赵六,陈七"

5、动态原型模式
定义:把所有信息都封装在了构造函数中,通过检查某个应该存在的方法是否有效来,来决定是否初始化原型。
优点:保持构造函数和原型的优点,动态添加原型。

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    if(typeof this.sayName !== "function"){
        Person.prototype.sayName=function(){
            alert(this.name);
        }
    }
}
var person1=new Person("张三",25,"搬砖");
person1.sayName();

小结:js中并没有类的概念,js的对象可以定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。创建对象的方法并非没有最优,要根据不同情形使用不同的方式去创建对象,

猜你喜欢

转载自blog.csdn.net/u011200023/article/details/80928463