列举几种创建对象的方法,并说明每种方法的使用场景

本贴最后更新于 1885 天前,其中的信息可能已经物是人非

2019-01-28

回答

对象字面量

通常用于存储一次性数据。

const person = {
  name: "John",
  age: 50,
  birthday() {
    this.age++
  }
}
person.birthday() 
console.log(person.age) // 51 

构造函数

通常用于为一个对象创建多个实例的场景,每个实例都不会受到该对象的其他实例的影响,他们有自己独立的数据。new 关键字必须位于构造函数之前,否则下例中的 nameage 将会挂载到 window 上。

function Person(name, age) {
  this.name = name
  this.age = age
}
Person.prototype.birthday = function() {
  this.age++
}
const person1 = new Person("John", 50)
const person2 = new Person("Sally", 20)
person1.birthday()
console.log(person1.name, person1.age) // John 51
person2.birthday()
console.log(person2.name, person2.age) // Sally 21

工厂模式

和构造函数类似,都可以创造一个新的实例,但是他可以通过闭包存储私有数据。在函数调用或 this 关键字之前不需要使用 new 操作。工厂模式不使用原型链模式,他将所有属性和方法都做为自己的属性。

const createPerson = (name, age) => {
  const birthday = () => person.age++
  const person = { name, age, birthday }
  return person
}
const person = createPerson("John", 50)
person.birthday() 
console.log(person.age) // 51

Object.create()

可以设置新创建的对象的原型。Object.create() 的第二个参数可以提供新对象自身定义的可枚举属性。

const personProto = {
  birthday() {
    this.age++
  }
}
const person = Object.create(personProto, {
  age: {
    value: 50,
    writable: true,
    enumerable: true
  },
 name: {
    value: 'John',
    writable: true,
    enumerable: true
  }
})
person.birthday() 
console.log(person.age, person.name) // 51 "John"

加分回答

  • 原型链相关的方法可以让一个对象从其他对象中继承属性和方法。
  • 工厂模式可以通过闭包提供私有属性和方法,但这会增加内存的使用。
  • 类没有私有的属性和方法,他通过复用单个原型对象来减少内存的使用。
  • 对以上几种基本的模式可以进行组合使用,从而产生动态原型模式、寄生构造模式、稳妥构造模式。

返回总目录

每天 30 秒

  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 192 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • bdFK3000

    好文
    學習
    關注了