javascript 创建对象的几种方式

js中我们一般会使用对象字面量的形式来创建对象,但是如果出现大量相同的对象,
则就会出现大量冗余的代码。此时在es6之前我们可以使用函数来创建对象。

一、工厂模式

我们可以将不同的对象的公共属性和方法提取出来,放到一个对象中,然后调用该函
数时,将该对象返回。
function createPerson(name, age, job) {
  var obj = new Object()
  obj.name = name
  obj.age = age
  obj.job = job
  obj.sayName = function() {
    console.log("大家好我是" + this.name)
  }
  return obj
}
let p1 = createPerson("dl", 20, "码农")
p1.sayName()
console.log(p1)
上面代码解决的问题:创建多个相同对象的代码复用问题。
弊端:没有解决对象的标识问题。

二、构造函数模式

在工厂函数中不存在对象的标识,此时在构造函数中,因为需要使用new来创建实例对象,每一个实例对象都存
在__proto__指向原型对象,而原型对象也存在一个constructor指向构造函数,所以我们可以通过访问
constructor属性来判断对象的类别。
function Person(name, age) {
  this.name = name
  this.age = age
  this.sayName = function() {
    console.log("大家好,我是" + this.name)
  }
}
let p1 = new Person("张三", 20)
console.log(p1)
//Person { name: '张三', age: 20, sayName: [Function (anonymous)] }
构造函数模式的好处:解决对象的类型的问题
弊端:构造函数的方法再每一次进行实例化时,都会进行创建,导致内存浪费。

三、原型模式

因为在构造函数模式中,当多个实例化对象都需要新创建方法,所以这样会导致内存浪费。
所以采用原型模式,将属性和方法都放到原型对象上。
function Person() {

}
Person.prototype.name = "张三"
Person.prototype.age = 20
Person.prototype.sayName = function() {
  console.log("大家好")
}
这样将属性和方法都放到原型对象上,好处是解决了内存浪费的问题,但是存在的弊端是:不能自定义属性,因为不同实例对象的属性是不一样的,将属性放到原型对象上,属性不能改变。

四、组合构造函数和原型模式

主要是用来解决三中的属性的问题。也是用来解决内存浪费的问题。所以就让属性从外界传入。
function Person(name, age) {
  this.name = name
  this.age = age
}
Person.prototype.sayName = function() {
  console.log(this.name)
}
这个就是我们平时创建对象常用到的,但是仍然存在一些不足之处。
弊端:代码的封装性不是很好,一般我们在写某一块代码时,应该将其写到一块区域内。

五、动态原型模式

动态原型模式就是为了解决代码的封装性的问题。
function Person(name, age) {
  this.name = name
  this.age = age
  if (typeof this.sayName === "function") {
    Person.prototype.sayName = function () {
      console.log("大家好我的名字是" + this.name)
    } 
  }
}

六、寄生构造函数模式

如果以上的不适用,可以使用寄生构造函数模式,其思想就是封装一个对象
function Person(name, age) {
  var obj = new Object()
  obj.name = name
  obj.age = age
  obj.sayName = function() {
    console.log(this.name)
  }
  return obj
}
let p1 = new Person("dl", 20)
console.log(p1)
上面的代码基本和工厂函数相似,但是不同的是在进行实例化对象的时候,通过new来创建。
缺点:不能够依赖instanceof来进行判断对象类型。

七、稳妥构造函数模式

稳妥的构造函数模式就是基本和工厂函数一样,稳妥指的是没有公共属性并且不使用this,为了防止数据被其他应用程序更改。
function Person(name, age, job){

    //创建要返回的对象
    var o = new Object();

    //可以在这里定义私有变量和函数

    //添加方法
    o.sayName = function(){
        console.log(this.name);
    }

    //返回对象
    return o;
} 

var person1 =  Person("james"9"student");

person1.sayName(); // "james"
稳妥的缺点是:和寄生的一样不能使用instanceof来拿到属性名。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值