最近跟着视频学习了五种对象创建模式,做一个总结。
方式一:Object构造函数模式
概括:先创建空的Object对象,再动态添加属性和方法
适用场景:起始时对象的内部数据是不确定的
缺点:语句过多
var p =new Object();
p.name ='javascript';
p.age = 12;
p.setName = function(){
//代码块
}
方式二:对象字面量创建模式
概括:使用括号{}创建对象,同时指定属性和方法。
适用场景:起始时对象的内部函数是确定的。
缺点:如果创建多个对象,会有重复代码。
var p = {
name:"javascript",
age:12;
setName:function(){
//代码块
}
}
方式三:工厂模式
概括:通过工厂函数动态创建对象并返回。(所谓工厂函数,就是返回一个对象的函数,函数名自定义)
适用场景:需要创建多个对象
缺点:对象都是Object类型
function CreatPerson(name,age){
var obj = {
name:name,
age:age,
setName:function(name){
this.name=name;
}
}
return obj;
}
//创建两个人
var p1 = CreatPerson('Tom',12);
var p2 = CreatPerson('Jack',13);
function CreatStudent(name,mark){
var obj = {
name:mame,
mark:mark
}
return obj;
}
//创建一个学生
var s =CreatStudent('jerry',14);
创建的这些对象都是Object类型的,有时候我们需要区分类型
方式四:自定义构造函数
概括:通过new 创建对象
适用场景:需要创建多个不同类型的对象
缺点:每个对象都有相同的数据,浪费内存
function CreatPerson(name,age){
var obj = {
this.name:name,
this.age:age,
this.setName:function(name){
this.name=name;
}
}
var p1 = new Person('tom',12);
p1.setName =('jack');
console.log(p1 instanceof Person);
//true
方式五:构造函数加原型的组合模式
概括:自定义构造函数,属性在函数中初始化,方法添加到原型上
适用场景:需要创建多个类型确定的对象
function CreatPerson(name,age){
var obj = {
this.name:name,
this.age:age,
}
Person.prototype.setName = function(name){
this.name=name;
}
//写在原型对象中的方法,还是谁调用就指向谁,如果是调用者是实例对象,这个this就会指向实例对象
var p1 = new Person('tom',12);
p1.setName=('jack');
最后声明:
并不是说最后一种方式一定是最好的,
每一种对象创建模式都有优缺点,选择合适的方式才能够最大化的省内存。