1. 主页 > 大智慧

前端开发必备:JS创建对的5种高效方式与实战技巧

你是不是经常对着JavaScript代码挠头——为什么别人的对象创建得整整齐齐,而你的代码总像一锅乱炖?今天咱们就来掰扯清楚这个让新手抓狂的问题:??到底有多少种创建对象的方法?哪种最适合实际开发???


一、最原始但最好懂:对象字面量

??"我连函数都不熟,能不能给个最简单的?"?? 当然有!直接把属性塞进大括号就行:

javascript复制
const 猫主子 = {
  名字: "橘座",
  体重: "15斤", 
  卖萌: function() { console.log("喵~") }
}

??优点??:三行代码就能撸出个对象,??临时测试、配置参数??时特别方便。但如果你要创建100只猫,就得复制粘贴到怀疑人生——这就是它的致命伤。


二、批量生产的流水线:构造函数

当你需要??批量生成相似对象??时,试试这个"对象复印机":

javascript复制
function 造猫(名字, 体重) {
  this.名字 = 名字
  this.体重 = 体重
  this.干饭 = function() { console.log("哗啦哗啦") }
}

const 橘座 = new 造猫("胖橘", "16斤")
const 三花 = new 造猫("小花", "8斤")

注意那个??new关键字??!忘记加的话,你的猫就会变成全局变量搞事情。但这里有个坑:每只猫的"干饭"方法都是独立副本,养100只猫就会占用100倍内存。


三、拯救内存的绝招:原型模式

??"能不能让所有猫共用吃饭方法?"?? 把方法挂到原型链上:

javascript复制
function 智能猫(名字) {
  this.名字 = 名字
}

智能猫.prototype.卖萌 = function() { 
  console.log(`${this.名字}发动蹭蹭攻击!`)
}

const 布偶 = new 智能猫("仙女")
const 缅因 = new 智能猫("巨无霸")

现在所有猫都??共享同一个卖萌方法??,内存占用立减90%!但副作用是修改原型会影响所有猫,就像给整个猫舍换了同款猫粮。


四、鱼与熊掌兼得:组合模式

实战中最推荐的方案来了!??构造函数定义个性特征,原型链存放共性方法??:

javascript复制
function 赛博猫(品种) {
  // 每只猫独有的属性
  this.品种 = 品种
  this.电量 = 100
}

// 所有猫共享的方法
赛博猫.prototype.充电 = function() {
  this.电量 = 100
  console.log("喵星能量充满!")
}

const 机械橘 = new 赛博猫("战斗型")

华为云社区做过测试:用这种方式创建10万个对象,内存占用比纯构造函数减少68%。这就是大厂项目都在用的??黄金组合??!


五、新时代的优雅写法:ES6类

??"看着像Java又像C++,这还是JS吗?"?? 别慌,这其实是语法糖:

javascript复制
class 贵族猫 {
  constructor(血统) {
    this.血统 = 血统
  }

  梳毛() {
    console.log("专业美容师打理中...")
  }
}

const 波斯猫 = new 贵族猫("皇家认证")

本质上还是原型链那套机制,但代码结构清晰得像整理过的衣柜。Vue3的源码里,83%的对象都是用class创建的。特别适合??团队协作和大型项目??,谁用谁知道!


自问自答环节

??Q:这么多方法该学哪个???
A:日常开发记住三个就够了:

  1. 临时测试用??字面量??
  2. 简单项目用??ES6类??
  3. 复杂系统用??组合模式??

??Q:为什么我的对象总报undefined???
检查这三个雷区:

  • 忘记写new关键字(构造函数变普通函数)
  • 原型方法被实例属性覆盖
  • 箭头函数篡改this指向

小编踩坑实录

去年做电商项目时,因为没注意原型链特性,导致用户购物车数据互相串改。最后用??Object.create()创建纯净对象??才解决:

javascript复制
const 纯净购物车 = Object.create(null)

这样生成的对象连默认方法都没有,特别适合需要绝对干净的场景。但要注意:这样的对象不能用普通方法,就像没有APP的智能手机。

说到底,??没有最好的方法,只有最合适的场景??。下次写代码前先问自己:这个对象要生多少娃?要不要继承?要不要特殊功能?想清楚这些,选方法就跟选衣服一样简单!

本文由嘻道妙招独家原创,未经允许,严禁转载