对象
为对象添加原型
const obj = { x:1, y:2, add:function(a, b){ return a + b } }
使用prototype添加原型
const Empty = function(){} Empty.prototype = obj const empty = new Empty() empty.add(1, 2) // 3
使用Object.create()直接创建继承原型的对象的实例对象
const test = Object.create(obj, { // 第二个参数不传默认为{} "a": { value: 10, writable:false }, "b": { value: 100 }, })
override重载时,不会修改原型本身
empty.x = 10 console.log(empty.x) // 10 console.log(obj.x) // 1
查看原型
Object.getPrototypeOf(empty)
检测属性
in和hasOwnProperty均可用来检测对象中属性是否存在
hasOwnProperty只能检测自有属性,无法查找原型链,in可以检测自有属性或继承属性
const o = {x:1} o.hasOwnProperty("x") "x" in o
getOwnPropertyDescriptor可查看当前属性描述,但只能查看自有属性
// 输出{ value: 1, writable: true, enumerable: true, configurable: true } console.log(Object.getOwnPropertyDescriptor(o, "x"))
为对象添加属性
数据属性的四个特性分别是:值(value) 可写性(writable) 可枚举性(enumable) 可配置性(configurable)
Object.defineProperty(o, "y", { value: "test", // 值 enumerable:false, // 是否可枚举 writable:false, // 可写性 configurable:false // 可配置性 })
存取器
存取器属性的四个特性分别是:读取(get) 写入(set) 可枚举性(enumable) 可配置性(configurable)
const o = { x: "", get getX(){ return this.x }, set setX(val){ this.x = val } }
可以用闭包来实现私有属性,并定制get set
const Test = (function(){ let x = "10" return function(){ this.getX = function(){ return x } this.setX = function(val){ x = val } } })()
扩展对象
Object.assign(target, ...sources),将所有source对象中的可枚举属性分配到target对象
后面的source对象会覆盖前面的同名属性,也会覆盖target中的属性
let a = {a:0} let b = {a:1} let c = {a:2, b:3, c:4} const obj = Object.assign(a, b, c) console.log(obj) // { a: 2, b: 3, c: 4 }
若想避免原属性中的被覆盖,可以将其放在最后
const obj = Object.assign({}, b, c, a)
使用扩展操作符也可以做到相同操作(注:扩展操作符只能扩展自有属性,不能扩展继承属性,且本身为浅复制,引用类型扩展后仅扩展地址)
const obj = {...b, ...c, ...a}
对象字面量扩展方法
简写属性
let x = 1, y = 2 let o = {x, y} // o.x=1 o.y=2
可自动根据值来计算的属性名和方法名
const PROPERTY_NAME = "p1" const computerPropertyName = function() { return "p" + 2} let p = { [PROPERTY_NAME]: 1, [computerPropertyName()]() {return 2} } console.log(p.p1) // 1 console.log(p.p2()) // 2
可以使用Symbol标识符作为属性名
因为Symbol具有唯一性,所以可以防止与原对象中一些属性命名冲突带来的问题
const extension = Symbol("my extension symbol") let obj = { [extension]: { x: 0 }, "my extension symbol": { x: 1 } } console.log(obj[extension].x) // 0 console.log(obj["my extension symbol"].x) // 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
2020-11-27 cesium动画播放