JavaScript - 创建对象的5种常见模式

xiaoxiao2021-02-28  27

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(){ name:"张三", age:25, job:"搬砖", friends:["李五","赵六"], } Person.prototype={ construct:Person, 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的对象可以定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。创建对象的方法并非没有最优,要根据不同情形使用不同的方式去创建对象,

转载请注明原文地址: https://www.6miu.com/read-2500215.html

最新回复(0)