创建对象的有哪几种模式?

零下一度
零下一度 原创
2017-06-26 11:29:27 1073浏览

1 new Object()

先创建一个Object实例,然后为它添加属性和方法

var Person = new Object()
Person.name = 'hl'
Person.sayName = function () {
  console.log(this.name)
}

2 对象字面量法

对象字面量法是创建对象最快捷方便的方式,在很多场景下被使用。

var Person = {
  name: 'hl',
  sayName: function () {
    console.log(this.name)
  }
}

对象字面量法的缺点是创建多个同类对象时,会产生大量重复代码,因此有了工厂模式。

3 工厂模式

工厂模式用函数封装了创建对象的细节,调用函数时传入对象属性,然后返回一个对象。

function createPerson (name) {
  return {
    name: name,
    sayName: function () {
      console.log(this.name)
    }
  }
}
var person = createPerson('hl')
var person = new createPerson('hl') // 寄生构造函数模式

通过使用 new 操作符也可以获得同样的结果,这种方法被叫做寄生构造函数模式,(应该)与直接调用函数没什么区别。
工厂模式虽然解决了创建多个同类对象的问题,却无法识别对象是哪种具体类型。

4 构造函数模式

通过构造函数创建的对象,可以使用 instanceof 操作符可以确定对象的类型。按照编程惯例,构造函数命名应该大写,以和普通的函数区别开来。

function Person (name) {
  this.name = name
  this.sayName = function () {
    console.log(this.name)
  }
}
p = new Person('hl')
p instanceof Person // true

构造函数的特点:

  • 没有显示的创建对象

  • 属性和方法直接赋值给this

  • 没有 return 语句

  • 使用 new 操作符创建对象

构造函数的缺点是每个方法都会在每个实例上重新创建一遍,造成了内存浪费。

5 原型模式

使用原型模式,可以方便的为对象添加属性和方法。

function Person () {
}
var p = new Person()
Person.prototype.name = 'hl'
Person.prototype.sayName = function () {
  console.log(this.name)
}
p.sayName() // hl

原型具有动态性,即先创建对象再修改原型,实例也可以获得对应的属性和方法。
原型模式也并非没有缺点,第一,原型模式不能传递初始化参数,导致每个实例都会获得相同的属性;第二,对于引用类型的值,所有实例引用的是同一个对象,看下面的例子:

function Person () {
}
Person.prototype.relative = ['father','mother']

var person1 = new Person()
var person2 = new Person()
person1.relative.push('sister')
console.log(person2.relative) // [ 'father', 'mother', 'sister' ]

修改person1的属性,person2的属性也被修改了。实例一般是需要有属于自己的属性的,因此很少单独使用原型模式。

6 组合使用构造函数模式和原型模式

创建对象最常用的方式,就是组合使用构造函数模式和原型模式。构造函数用于自定义属性,原型模式用于定义共享的属性和方法。

function Person (name) {
  this.name = name
}
Person.prototype.sayName = function () {
  console.log(this.name)
}

7 动态原型模式

原型可以在构造函数中初始化,以便更好的封装对象创建过程。

function Person(name) {
  this.name = name
  if (typeof this.sayName !== 'function') {
    Person.prototype.setName= function (name) {
      this.name = name
    }
    Person.prototype.sayName = function () {
      console.log(this.name)
    }
  }
}

不必用if检查每一个属性或方法,只需要检查原型初始化后应该存在的其中一个属性或方法即可。

8 稳妥构造函数模式

稳妥对象指的是没有公共属性,其属性和方法也不引用this对象,并且不使用 new 操作符创建对象。适合用在一些需要安全的环境中,防止数据被修改。

function Person (name) {
  return {
    sayName: function () {
      console.log(name)
    }
  }
}
var person = Person('hl')

稳妥模式创建的对象,除了使用构造函数内定义的方法,没有办法修改和访问传入到构造函数中的原始数据。

以上就是创建对象的有哪几种模式?的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。