别再把对象当“字典”!JS 零基础也能看懂的“属性账本”拆解笔记

前言

目前我的 JS 技能树点亮了"对象"这一格,这篇文章就是一份"新手村"笔记,只用我已掌握的钥匙,把对象这只"收纳盒"的隔层、暗格、标签一次性摸清楚,不越级打怪,也不提前透支未来语法。如果你也刚学完对象,想先把它玩透再往下走,欢迎一起原地复盘,把基础踩成肌肉记忆。

对象

  • 在 js 这门语言中流传着一句话叫 万物皆对象,顾名思义不管你是哪种数据类型都可看作是对象。
    我们知道的数据类型可分为两种------原始类型和引用类型
  1. 原始类型 又叫简单类型,有 string number boolean undefined null Symbol bigInt
  2. 引用类型 又叫复杂类型,有 function array object
  • 在解释为什么万物都可被称为对象之前我们先聊今天第一个话题------如何创建一个对象

一. 创建对象的方式

1. 对象字面量 只用一个 {} 就能解决

arduino 复制代码
const obj = {
    a : 1
    }    // 这是我们最常看到的

2. new Object()new Object() 创建一个对象后,再在外围添加属性

ini 复制代码
const obj = new Object()  // 构造函数
obj.name = '饶总'
const abc = 'age'   // 目的添加 key 为 age ,value 为 20
obj[abc] = 20   //当 abc 是变量的时候用[],就可直接访问到 age
delete obj[abc]   //要删掉属性就用 delete
console.log(obj);

3. new 调用自定义的构造函数 关于构造函数

  • 当我们需要批量化创建对象时,可以使用构造函数
    方便理解这句话,首先我们设立一个目标,我们要把公司员工的姓名年龄职位输入到系统里面方便统计管理,按照古板的方法就是创造无数个职位对应的函数,一个一个输入姓名年龄放进去
javascript 复制代码
function Insert(name, age) {
  const obj = {
    name: name,
    age: age,
    job: 'coder'
  }
  return obj
}

function Insert2(name, age) {
  const obj = {
    name: name,
    age: age,
    job: 'manager'
  }
  return obj
}

Insert('饶总', 18)

但是栈的容量有限,函数过多就会导致爆栈,那么这个时候就可以用构造函数来解决

ini 复制代码
function Insert(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
}
const p = new Insert('晓总', 18, 'coder') // { name: '晓总', age: 18, job: 'coder' }
const p2 = new Insert('佳颖', 19, 'manager')
console.log(p);
console.log(p2);
  • 当一个函数被 new 调用时,我们称之为构造函数
    再来一个关于生产汽车的例子
ini 复制代码
function Car(color) {
  this.name = 'su7'
  this.height = '1400'
  this.lang = '4800'
  this.weight = '1500'
  this.color = color
}

const car1 = new Car('purple') // 实例化一个对象
const car2 = new Car('yellow')

由于生产的汽车的大部分标签是一样的,只有极个别标签能自行选择,这个时候用 new 构造一个函数就显得尤为高明

二. new 干了什么?

  1. 创建一个 this 对象
  2. 执行构造函数中的代码,就是给 this 对象添加属性值
  3. 返回这个 this 对象
objectivec 复制代码
function person() {
  const _this = {}   //构造一个 _this 对象
  _this.name = 'su7'   
  _this.color = 'green'  //给该对象添加属性值
  return _this       //返回该对象
}

const obj = person()

console.log(obj);

三. 什么是包装类?

1. 当用户定义一个字面量,v8默认执行的还是 new Xxx()

ini 复制代码
var num = 123  //var num = new Number(123)  
var str = 'hello'  //var str = new String('hello')

2. 一个包装类的实例对象,在参与运算时,会自动拆箱成原始类型

dart 复制代码
var num = 123  // v8 默认执行 var num = new Number(123)
num.a = 'aaa'
//delete num.a   // 发现是原始类型就自动删除
console.log(num.a); // 执行结果为 undefined,既证明了 num 可以是对象,又说明了 num 的属性被删除了

3. 因为 js 是弱类型语言, 所以只有在赋值语句执行时才会判断值的类型(typeof),当值被判定为原始类型时,就会自动将包装对象上添加的属性移除

python 复制代码
var str = 'hello' 
//typeof('hello')   判断类型为string
//  v8执行 var str = new String('hello')
str.len = 2
//delete str.len  将包装对象上添加的属性移除

结语

对象既是 JavaScript 的地基,也是后续所有语法的交汇点;先把这块"自留地"的边界、门牌和规则摸透,再学任何新框架都能事半功倍。愿这份最基础的笔记,能在你未来的进阶路上当一块靠谱的垫脚石。感谢阅读!

相关推荐
起名时在学Aiifox1 小时前
Vue3 + Element Plus 表格排序实战:基于状态字段的智能排序方案
前端·javascript·vue.js·element plus
yzx9910131 小时前
基于Flask的智能语音增强系统模拟
前端·javascript·html
青衫码上行1 小时前
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式
java·前端·javascript·学习·正则表达式
我的虾分发2 小时前
虾分发是一个键打包封装APP内测分发平台
javascript
天才熊猫君2 小时前
vue3 基于 el-table 的无限滚动自定义指令实现
前端·javascript
3秒一个大2 小时前
从代码示例看 ES8 中的 async/await:简化异步操作的利器
javascript
努力往上爬de蜗牛2 小时前
react native token失效 刷新机制
javascript·react native·react.js
Sailing2 小时前
🚀 Promise.then 与 async/await 到底差在哪?(这次彻底讲明白)
前端·javascript·面试
鹤鸣的日常2 小时前
Vue + element plus 二次封装表格
前端·javascript·vue.js·elementui·typescript