欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

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

程序员文章站 2022-04-05 13:05:47
...

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')

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

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