对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < meta http-equiv="X-UA-Compatible" content="IE=edge"> < meta name="viewport" content="width=device-width, initial-scale=1.0"> < title >Document</ title > </ head > < body > < script > /* 1.属性的类型 数据属性 访问器属性 */ /* 数据属性-- [Configurable]是否可删除并重新定义,是否可以修改他的特性, [Enumberable]是否可以 for-in循环返回, [Writable]是否可以被修改 [Value]包含属性的实际值 */ let person = {} Object.defineProperty(person,"name",{ writable: false, value: "Nicjoles" }); console.log(person.name); // Nicjoles person.name = "Greg"; console.log(person.name); // Nicjoles // 证明没有被修改成功 /* 访问器属性-- [Configurable]是否可删除并重新定义,是否可以修改他的特性, [Enumberable]是否可以 for-in循环返回, [Get]获取函数,在读取属性时调用 [Set]设置函数,在写入属性时调用 */ let book = { year_:2017, edition: 1 }; Object.defineProperty(book,"year",{ get() { return this.year_; }, set(newValue) { if(newValue > 2017) { this.year_ = newValue; this.edition += newValue - 2017; } } }); book.year = 2018; console.log(book.edition); // 2 /* 2.合并对象 Object.assign() 可合并一个或多个对象,并返回,不影响原对象 实际上对源对象执行的是潜复制 浅复制意味着只会复制对象的引用*/ let dest, src, result; dest = {}; src = { id: 'src' }; result = Object.assign(dest, src); console.log(result); // Object { id: "src" } /* 3.对象解构 */ // 不使用对象解构 let person2 = { name: 'mack', age: 12 } let personName = person2.name, personAge = person2.age; //使用对象解构 let { name: personName2, age: personAge2 } = person2; console.log(personName2); // mack console.log(personAge2); // 12 // 或者提前声明变量 let personName3, personAge3; ({ name: personName3, age: personAge3 } = person2); // 注意(源对象的修改,会影响新对象) // 部分解构出错,会影响后续的解构 /* 4.构造函数模式 --构造函数也是函数,任何函数只要使用new操作符调用就是构造函数,而不使用new操作符调用的函数就是普通函数 --函数声明function Person(){} --函数表达式let Person = function(){} */ function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { console.log(this.name); } } // 在另一个对象的作用域中调用 // 将特定对象指定为作用域,这里的调用将对象o指定为Person()内部的this值,因此执行完函数后,所有属性和sayName()方法都会添加到对象o上面 let o = new Object(); Person.call(o, "nike", 25, "web"); o.sayName(); /* 5.对象迭代 ----Object.values() 返回对象值的数组 ----Object.entries() 返回键、值对的数组 注意:非字符串属性会被转换为字符串输出,另外,这两个方法执行对象的浅复制 */ const o5 = { foo: 'baz', age: 12, qux: {} } console.log(Object.values(o5)); // Array(3) [ "baz", 12, {} ] /* 0: Array [ "foo", "baz" ] 1: Array [ "age", 12 ] 2: Array [ "qux", {} ] length: 3 */ console.log(Object.entries(o5)); </ script > </ body > </ html > |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?