创建对象的几种模式

对象字面量的方式不能量产“同类”对象。

1. 工厂模式

function createPerson(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(this.name);
  }
  return o
}

var person1 = createPerson('Richard', 21, 'Engineer');
var person2 = createPerson('Gary', 19, 'Fool');

评价:解决了创建相似对象的问题,但无法识别对象的类型。

2. 构造函数模式

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  this.printName = function() {
    console.log(this.name)
  }
}

var person1 = new Person('Terry', 21, 'Software Engineer')
var person2 = new Person('Jerry', 12, 'Doctor')

特点:

  • 没有显示创建对象,直接将属性和方法赋值给了this对象;没有return语句
  • 自定义的构造函数实例化后的实例属于该特定类型(即instanceof值为该构造函数)

使用new调用构造函数时发生的事儿:

  1. 创建一个新的对象
  2. 将构造函数的作用域赋给上述新对象,即this指向该新对象
  3. 执行构造函数中的代码(为新对象添加属性和方法)
  4. 返回新对象

缺点:如上示例中,person1与person2的printName属性并非同一个,即使功能相同,即不能共享函数或属性。

3. 原型模式

每个函数都有一个prototype属性,该属性是一个指向原型对象的指针。

而这个“原型对象”的用途就是用来共享属性和方法的。

function Person() {
}

Person.prototype.name = 'Zed'
Person.prototype.age = 21
Person.prototype.job = 'driver'
Person.prototype.printName = function() {
  console.log(this.name)
}

var person1 = new Person()
var person2 = new Person()
person1.printName()

如上所示:name, age, job, printName是所有Person实例所共享的

4. 组合使用构造函数模式与原型模式

构造函数用于定义实例属性,原型模式用于定义共享方法与共享属性。

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  this.friends = ['sheldon', 'penny']
}

Person.prototype = {
  constructor: Person,
  printName: function() {
    console.log(this.name)
  }
}

const Rajesh = new Person('Rajesh', '35', 'Astronomer')
const Howard = new Person('Howard', '36', 'Applied Physicist')

这种构建模式是目前使用最广泛、认同度最高的创建自定义类型的方法。可以说是定义引用类型的一种默认模式了。

5. 动态原型模式

该模式避免了 构造函数与原型的分离,将原型的定义封装在了构造函数中

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  if (typeof this.printName !== 'function') {
    Person.prototype.printName = function() {
      console.log(this.name)
    }
  }
}

6. 寄生构造函数模式

function Person(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(this.name)
  }
  return o
}

const friend = new Person('Nite', 22, 'Noidea')

注意:寄生函数构造模式返回的对象与构造函数或者构造函数的原型属性间没有任何联系。也就是说,该模式返回的对象与在构造函数外创建的对象没什么不同,不指定对象类型。
使用场景:在不行改变Array数组原型的情况下添加额外方法,可用此模式。

7. 稳妥构造函数模式

Douglas Crockford发明了稳妥对象 (durable objects)

所谓稳妥对象,指的是没有公共属性,而且其方法不能引用this对象。适合在安全环境中使用。

与寄生构造函数模式的不同点:

  • 新创建对象的实例方法不引用this
  • 不适用new操作符调用构造函数
function Person(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(name)
  }
  return o
}

不太明白啥意思 暂时也用不到吧,就这样吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值