10走进JS对象
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" 6 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>10走进JS对象</title> 9 </head> 10 <body> 11 12 <script> 13 /* 14 对象: 对象是属性和方法的集合,即封装。 15 方法: 定义在对象中的函数我们称为方法(方法是特殊的属性)。 16 示例: 17 let obj = { 18 // 属性 19 name: 'lc', 20 // 方法 21 get: function() { 22 return this.name; 23 }, 24 }; 25 console.log(obj.get()); 26 */ 27 28 /*10.1 */ 29 /*10.1.1 函数式编程*/ 30 // let name = "lc"; 31 // let grade = [ 32 // {name:"js",score: 99}, 33 // {name:"docker",score: 76}, 34 // ]; 35 // function average(grade, name) { 36 // let total = grade.reduce((t,l) => t + l.score,0); 37 // return `${name} 的平均成绩是:${total / grade.length}`; 38 // } 39 // console.log(average(grade, name)); // lc 的平均成绩是:87.5 40 41 /*10.1.2 对象式编程*/ 42 // let user = { 43 // name: "lc", 44 // grade: [ 45 // {name:"js",score: 99}, 46 // {name:"docker",score: 76}, 47 // ], 48 // average: function () { 49 // let total = this.grade.reduce((t,l) => t + l.score,0); 50 // return `${this.name} 的平均成绩是:${total / this.grade.length}`; 51 // }, 52 // }; 53 // console.log(user.average()); // lc 的平均成绩是:87.5 54 55 /*10.2 对象属性的基本操作*/ 56 // let user = { 57 // name: 'zhangSan', 58 // "my age": 18, 59 // }; 60 // // 点语法(推荐) 61 // console.log(user.name); // zhangSan 62 // // 没有使用标准命名时使用中括号取对象属性值 63 // console.log(user["my age"]); // 18 64 // // for循环时使用中括号取对象属性值 65 // for (const key in user) { 66 // console.log(user[key]); // zhangSan 18 67 // } 68 // // 给对象添加属性 69 // user.city = "shanghai"; 70 // user.get = function () { 71 // return `${this.name}所在的城市为${this.city}`; 72 // } 73 // console.log(user.get()); // zhangSan所在的城市为shanghai 74 // // 给对象删除属性 75 // console.log(delete user.city); // true 76 // console.log(user.city); // undefined 77 78 /*10.3 对象的引用传址*/ 79 /*10.3.1 对象是一个引用类型*/ 80 // let user = {}; 81 // let web = user; 82 // web.name = "liSi"; 83 // console.log(user.name); // liSi 84 // console.log(web.name); // liSi 85 86 /*10.3.2 函数传值类型*/ 87 // let a = 1; 88 // // show 函数形参 a 属于函数局域变量,和全局变量 a 没有关系 89 // function show (a) { 90 // a = a + 100; 91 // console.log(a); 92 // } 93 // show(a); // 101 94 // console.log(a); // 1 95 96 /*10.3.3 函数传引用类型*/ 97 // let user = {name: "liSi"}; 98 // // show 函数的形参 user 属于函数局域变量,和全局变量 user 没有关系 99 // function show (user) { 100 // user.age = 18; 101 // console.log(user); 102 // } 103 // show(user); // {name: 'liSi', age: 18} 104 // console.log(user); // {name: 'liSi', age: 18} 105 106 /*10.4 展开语法在对象中的使用*/ 107 // let user = { 108 // name: "liSi", 109 // age: 18, 110 // }; 111 // let info = {...user,city: "shanghai"}; 112 // console.log(user); // {name: 'liSi', age: 18} 113 // console.log(info); // {name: 'liSi', age: 18, city: 'shanghai'} 114 115 /*10.5 解构赋值*/ 116 // 将对象变为变量 117 /*10.5.1 解构赋值基本使用*/ 118 // let user = {name:"liSi",age:18}; 119 // console.log(user); // {name: 'liSi', age: 18} 120 // // 属性名和值名一样时可以只简写属性名 121 // let {name, age} = user; // let {name: name, age: age} = user; 122 // console.log(name, age); // liSi 18 123 124 /*10.5.2 对函数返回的对象进行解构赋值*/ 125 // function show() { 126 // return {name:"liSi",age:18}; 127 // } 128 // let {name,age} = show(); 129 // console.log(name,age); // liSi 18 130 131 /*10.5.3 对函数传参进行解构赋值*/ 132 // function user({name,age}) { 133 // console.log(name,age); 134 // } 135 // user({name:"liSi",age:18}); // liSi 18 136 137 /*10.5.4 对象解构时只取一个值*/ 138 // let user = {name:"liSi",age:18}; 139 // let {age} = user; 140 // console.log(age); // 18 141 142 /*10.6 变量解构*/ 143 // 将变量变为对象 144 // let name = "liSi", 145 // age = 18; 146 // // 属性名和值名一样时可以只简写属性名 147 // let opt = {name, age}; // let opt = {name: name, age: age}; 148 // console.log(opt); // {name: 'liSi', age: 18} 149 150 /*10.7 多层对象的解构操作*/ 151 // let web = { 152 // name: "baidu", 153 // lesson: { 154 // title: "js", 155 // }, 156 // }; 157 // let {name, lesson:{title}} = web; 158 // console.log(name,title); // baidu js 159 160 /*10.8 解构默认值实现配置项合并*/ 161 /*10.8.1 数组解构*/ 162 // let arr = ["baidu","baidu.com"]; 163 // let [a,b,c="web"] = arr; 164 // console.log(a,b,c); // baidu baidu.com web 165 166 /*10.8.2 对象解构*/ 167 // let user = {name: "baidu", url: "baidu.com", title: "搜索引擎"}; 168 // // 为title定义默认值,有值时使用已有值,没有值时使用定义的默认值 169 // let {url,name,title="全球第一的中文搜索引擎"} = user; 170 // console.log(name,url,title); // baidu baidu.com 搜索引擎 171 172 /*10.9 函数参数的解构特性使用技巧*/ 173 /*10.9.1 数组的方式*/ 174 // function web([name,url]) { 175 // console.log(name,url); 176 // } 177 // web(["baidu","baidu.com"]); // baidu baidu.com 178 179 /*10.9.2 对象的方式*/ 180 // function web(info, {name, url}) { 181 // console.log(info, name, url); 182 // } 183 // web("搜索引擎", {name: "baidu", url: "baidu.com"}); // 搜索引擎 baidu baidu.com 184 185 /*10.10 对象属性的添加删除操作*/ 186 /*10.10.1 对象属性添加操作*/ 187 // let web = {}; 188 // web.name = "baidu"; 189 // web['url'] = "baidu.com"; 190 // console.log(web); // {name: 'baidu', url: 'baidu.com'} 191 192 /*10.10.2 对象属性删除操作*/ 193 // let web = {name: "baidu", url: "baidu.com"}; 194 // console.log(delete web.url); // true 195 // console.log(web); // {name: 'baidu'} 196 197 /*10.10.3 检测对象中属性是否存在*/ 198 // let web = {name: "baidu", url: "baidu.com"}; 199 // console.log(web.hasOwnProperty("name")); // true 200 // console.log(web.hasOwnProperty("info")); // false 201 202 /*10.11 对象与原型链属性检测实例*/ 203 /*10.11.1 基本使用*/ 204 // let web = ["baidu","baidu.com"]; 205 // console.log(web); // (2)['baidu', 'baidu.com'] 206 // // 不能检测对象的原型属性(父级属性),只能检测自身的属性。 207 // console.log(web.hasOwnProperty("length")); // true 208 // console.log(web.hasOwnProperty("concat")); // false 209 // // 能检测对象的原型属性(父级属性)和自身的属性。 210 // console.log('length' in web); // true 211 // console.log('concat' in web); // true 212 213 /*10.11.2 为对象添加原型*/ 214 // let a = { 215 // name: "baidu", 216 // }; 217 // let b = { 218 // url: "baidu.com", 219 // }; 220 // // 把 b 对象作为 a 对象的父亲 221 // Object.setPrototypeOf(a,b); 222 // console.log(a); 223 // /* 224 // {name: 'baidu'} 225 // name: "baidu" 226 // [[Prototype]]: Object 227 // url: "baidu.com" 228 // [[Prototype]]: Object 229 // */ 230 // console.log(a.hasOwnProperty("url")); // false 231 // console.log("url" in a); // true 232 233 /*10.12 对象的计算属性与使用*/ 234 /*10.12.1 对象的计算属性基本使用*/ 235 // let web = {}; 236 // let name = "url"; 237 // web[name] = "sina.com"; 238 // console.log(web.url); // sina.com 239 240 // let web = {name: "baidu", url:"baidu.com"}; 241 // let liu = "chang"; 242 // web[liu] = "sky" 243 // console.log(web); // {name: 'baidu', url: 'baidu.com', chang: 'sky'} 244 // console.log(web[liu]); // sky 245 // console.log(web["chang"]); // sky 246 247 /*10.12.2 对象的计算属性示例*/ 248 // let web = {}; 249 // let id = 0; 250 // web[`id=${++id}`] = id; 251 // web[`id=${++id}`] = id; 252 // web[`id=${++id}`] = id; 253 // console.log(web); // {id=1: 1, id=2: 2, id=3: 3} 254 255 /*10.13 对象的遍历操作*/ 256 /*10.13.1 基本用法*/ 257 // let web = { 258 // name: 'baidu', 259 // url: "baidu.com", 260 // }; 261 // // 获取对象所有的属性名 262 // console.log(Object.keys(web)); // (2)['name', 'url'] 263 // // 获取对象所有的属性值 264 // console.log(Object.values(web)); // (2)['baidu', 'baidu.com'] 265 // // 同时获取对象的属性名和对应的属性值 266 // console.log(Object.entries(web));// (2)[Array(2), Array(2)] 267 268 /*10.13.2 循环*/ 269 // for in 循环 270 // let web = { 271 // name: 'baidu', 272 // url: "baidu.com", 273 // }; 274 // for (const key in web) { 275 // console.log(key, web[key]); 276 // /* 277 // name baidu 278 // url baidu.com 279 // */ 280 // } 281 282 // for of 循环默认不能操作对象,可以操作数组 283 // let web = [{name:'baidu', url:"baidu.com"}]; 284 // for (const value of web) { 285 // console.log(value.name, value.url); // baidu baidu.com 286 // } 287 288 // for of 循环对象 289 // let web = { 290 // name: 'baidu', 291 // url: "baidu.com", 292 // }; 293 // // for of 遍历对象属性 294 // for (const key of Object.keys(web)) { 295 // console.log(key); // name url 296 // } 297 // // for of 遍历对象属性值 298 // for (const value of Object.values(web)) { 299 // console.log(value); // baidu baidu.com 300 // } 301 // // for of 同时遍历对象属性和属性值 302 // for (const [key,value] of Object.entries(web)) { 303 // console.log(key,value); // name baidu url baidu.com 304 // } 305 306 /*10.14 对象的浅拷贝多种操作方法*/ 307 /*10.14.1 对象是一种引用类型,传递的是内存地址*/ 308 // let web = {name: 'baidu'}; 309 // let sky = web; 310 // sky.name = 'sina'; 311 // console.log(web,sky); // {name: 'sina'} {name: 'sina'} 312 313 /*10.14.2 对象的浅拷贝*/ 314 // 浅拷贝不能对深层次的对象进行复制,所以浅拷贝可以理解为是值类型的对象复制 315 // let web = {name: 'baidu'}; 316 // let sky = {name: web.name}; 317 // sky.name = 'sina'; 318 // console.log(web,sky); // {name: 'baidu'} {name: 'sina'} 319 320 // let web = {name:"baidu", url:"baidu.com"}; 321 // let sky ={}; 322 // for (const key in web) { 323 // sky[key] = web[key]; 324 // } 325 // sky.name = "百度"; 326 // console.log(web, sky); // {name: 'baidu', url: 'baidu.com'} {name: '百度', url: 'baidu.com'} 327 328 // let web = {name:"baidu", url:"baidu.com"}; 329 // let sky = Object.assign({}, web); 330 // sky.name = "百度"; 331 // console.log(web, sky); // {name: 'baidu', url: 'baidu.com'} {name: '百度', url: 'baidu.com'} 332 333 // let web = {name:"baidu", url:"baidu.com"}; 334 // let sky = {...web}; // 定义花括号等于开辟内存空间 335 // sky.name = "百度"; 336 // console.log(web, sky); // {name: 'baidu', url: 'baidu.com'} {name: '百度', url: 'baidu.com'} 337 338 /*10.15 深拷贝多层次分析*/ 339 /*10.15.1 浅拷贝深层对象示例*/ 340 // let obj = { 341 // name: "baidu", 342 // url: { 343 // name: "baidu.com", 344 // }, 345 // }; 346 // let web = { 347 // name: obj.name, 348 // url: obj.url, 349 // }; 350 // web.name = "百度"; 351 // web.url.name = "www.baidu.com" 352 // console.log(obj); 353 // /* 354 // {name: 'baidu', url: {…}} 355 // name: "baidu" 356 // url: {name: 'www.baidu.com'} 357 // */ 358 // console.log(web); 359 // /* 360 // {name: '百度', url: {…}} 361 // name: "百度" 362 // url: {name: 'www.baidu.com'} 363 // */ 364 365 /*10.15.2 深拷贝对象示例*/ 366 // function copy(object) { 367 // let res = {}; 368 // for(const key in object) { 369 // res[key] = typeof object[key] == 'object' ? copy(object[key]) : object[key]; 370 // } 371 // return res; 372 // } 373 // let obj = { 374 // name: "baidu", 375 // url: { 376 // name: "baidu.com", 377 // }, 378 // }; 379 // let web = copy(obj); 380 // web.name = "百度"; 381 // web.url.name = "www.baidu.com"; 382 // console.log(obj); 383 // /* 384 // {name: 'baidu', url: {…}} 385 // name: "baidu" 386 // url: {name: 'baidu.com'} 387 // */ 388 // console.log(web); 389 // /* 390 // {name: '百度', url: {…}} 391 // name: "百度" 392 // url: {name: 'www.baidu.com'} 393 // */ 394 395 /*10.15.3 深拷贝对象、数组示例*/ 396 // console.log(typeof []); // object 397 // console.log(typeof {}); // object 398 // console.log([] instanceof Array); // true 399 // console.log({} instanceof Object); // true 400 401 // function copy(object) { 402 // let res = object instanceof Array ? [] : {}; 403 // for(const [key, value] of Object.entries(object)) { 404 // res[key] = typeof value == 'object' ? copy(value) : value; 405 // } 406 // return res; 407 // } 408 // let obj = { 409 // name: "baidu", 410 // url: { 411 // name: "baidu.com", 412 // }, 413 // arr: ["新浪","sina.com"], 414 // }; 415 // let web = copy(obj); 416 // web.name = "百度"; 417 // web.url.name = "www.baidu.com"; 418 // web.arr.push("传媒"); 419 // console.log(obj); 420 // /* 421 // {name: 'baidu', url: {…}, arr: Array(2)} 422 // arr: (2) ['新浪', 'sina.com'] 423 // name: "baidu" 424 // url: {name: 'baidu.com'} 425 // */ 426 // console.log(web); 427 // /* 428 // {name: '百度', url: {…}, arr: Array(3)} 429 // arr: (3) ['新浪', 'sina.com', '传媒'] 430 // name: "百度" 431 // url: {name: 'www.baidu.com'} 432 // */ 433 434 /*10.16 使用工厂函数创建对象*/ 435 // function User(name) { 436 // return { 437 // name, 438 // show: function () { 439 // console.log(this.name + "-外星人"); 440 // }, 441 // }; 442 // } 443 // let liSi = new User("李四"); 444 // console.log(liSi); // {name: '李四', show: ƒ} 445 // liSi.show(); // 李四-外星人 446 // let wageEr = new User("王二"); 447 // console.log(wageEr); // {name: '王二', show: ƒ} 448 // wageEr.show(); // 王二-外星人 449 450 /*10.17 构造函数创建对象的方式*/ 451 // 命名规范: 每个单词的首字母大写,this表示调用当前方法(函数)的对象。 452 // function User(name) { 453 // this.name = name; 454 // this.show = function () { 455 // console.log(this.name); 456 // console.log(this); 457 // }; 458 // } 459 // let liSi = new User("李四"); 460 // console.log(liSi); // User{name: '李四', show: ƒ} 461 // liSi.show(); // 李四 User{name: '李四', show: ƒ} 462 // let func = liSi.show; 463 // func(); //"" windows对象 464 465 /*10.18 面向对象的封装与抽象*/ 466 // 将复杂功能隐藏在内部,只开放给外部少量方法,更改对象内部的复杂逻辑不会对外部调用造成影响即抽象。 467 // 使用闭包特性将对象进行抽象处理。 468 // function User(name,age) { 469 // // 为对象属性做抽象处理,不允许外部修改 470 // let data = {name, age}; 471 // let info = function () { 472 // return data.age > 50 ? "老年" : "青年"; 473 // }; 474 // this.show = function () { 475 // console.log(data.name + info()); 476 // }; 477 // } 478 // let liSi = new User("李四",24); 479 // liSi.name = "王二"; 480 // liSi.info = function () { 481 // return ""; 482 // } 483 // liSi.show() // 李四青年 484 485 /*10.19 对象的属性特征*/ 486 // let user = { 487 // name: "李四", 488 // age: 18, 489 // }; 490 // // 查看对象中一个属性的特征 491 // console.log(JSON.stringify(Object.getOwnPropertyDescriptor(user,"name"),null,2)); 492 // /* 493 // { 494 // "value": "李四", // 设置属性值 495 // "writable": true, // 属性值可以修改 496 // "enumerable": true, // 属性可以遍历,使用Object.keys()可以读取到内容 497 // "configurable": true // 属性可以删除、属性特征可以被重新配置 498 // } 499 // */ 500 // // 查看对象中所有属性的特征 501 // console.log(JSON.stringify(Object.getOwnPropertyDescriptors(user),null,2)); 502 // /* 503 // { 504 // "name": { 505 // "value": "李四", 506 // "writable": true, 507 // "enumerable": true, 508 // "configurable": true 509 // }, 510 // "age": { 511 // "value": 18, 512 // "writable": true, 513 // "enumerable": true, 514 // "configurable": true 515 // } 516 // } 517 // */ 518 519 /*10.20 灵活控制属性的特征*/ 520 /*10.20.1 更改对象单个属性特征*/ 521 // let user = { 522 // name: "李四", 523 // age: 18, 524 // }; 525 // // 查看对象中一个属性的特征 526 // console.log(JSON.stringify(Object.getOwnPropertyDescriptor(user,"name"),null,2)); 527 // /* 528 // { 529 // "value": "李四", 530 // "writable": true, 531 // "enumerable": true, 532 // "configurable": true 533 // } 534 // */ 535 // // 更改对象某个属性特征 536 // Object.defineProperty(user,"name",{ 537 // value: "张三", // 修改属性值 538 // writable: false, // 修改属性值不允许修改 539 // }); 540 // // 查看对象中一个属性的特征 541 // console.log(JSON.stringify(Object.getOwnPropertyDescriptor(user,"name"),null,2)); 542 // /* 543 // { 544 // "value": "张三", 545 // "writable": false, 546 // "enumerable": true, 547 // "configurable": true 548 // } 549 // */ 550 // console.log(user.name); // 张三 551 // // 修改user对象的name属性值修改不成功 552 // user.name = "王二"; 553 // console.log(user.name); // 张三 554 555 /*10.20.2 更改对象所有属性特征*/ 556 // let user = { 557 // name: "李四", 558 // age: 18, 559 // }; 560 // Object.defineProperties(user, { 561 // name: { 562 // // 修改该属性的值 563 // value: "张三", 564 // writable: true, 565 // enumerable: true, 566 // configurable: true 567 // }, 568 // age: { 569 // // 修改该属性的值 570 // value: 26, 571 // writable: true, 572 // // 设置该属性不可被遍历 573 // enumerable: false, 574 // configurable: true 575 // } 576 // }); 577 // console.log(user.name,user.age); // 张三 26 578 // console.log(Object.values(user)); // ['张三'] 579 580 /*10.21 不允许向对象中添加属性API*/ 581 // let user = { 582 // name: "liSi", 583 // age: 18, 584 // } 585 // // 设置不允许向对象中添加属性 586 // Object.preventExtensions(user); 587 // // 对象是否可添加新属性判断,为true时可添加,为false时不可添加 588 // if (Object.isExtensible(user)) { 589 // user.city = "上海"; 590 // } 591 // console.log(user); // {name: "liSi", age: 18} 592 593 /*10.22 封闭对象的API操作*/ 594 // 不能往对象中添加属性,不能删除对象属性,不能修改对象的属性特征 595 // let user = { 596 // name: "liSi", 597 // age: 18, 598 // } 599 // // 设置对象为封闭状态 600 // Object.seal(user); 601 // // 查看对象的所有属性特征 602 // console.log(JSON.stringify(Object.getOwnPropertyDescriptors(user),null,2)); 603 // /* 604 // { 605 // "name": { 606 // "value": "liSi", 607 // "writable": true, 608 // "enumerable": true, 609 // "configurable": false 610 // }, 611 // "age": { 612 // "value": 18, 613 // "writable": true, 614 // "enumerable": true, 615 // "configurable": false 616 // } 617 // } 618 // */ 619 // // 判断对象是否为封闭状态,为true时为封闭状态,false为非封闭状态 620 // if (!Object.isSealed(user)) { 621 // // 增加对象属性 622 // user.city = "shangHai"; 623 // // 删除对象属性 624 // delete user.name; 625 // } 626 // console.log(user); // {name: "liSi", age: 18} 627 628 /*10.23 冻结对象API特性*/ 629 // 不能往对象中添加属性,不能删除对象属性,不能修改对象属性值,不能修改对象的属性特征 630 // let user = { 631 // name: "liSi", 632 // age: 18, 633 // } 634 // // 设置对象为冻结状态 635 // Object.freeze(user); 636 // // 查看对象的所有属性特征 637 // console.log(JSON.stringify(Object.getOwnPropertyDescriptors(user),null,2)); 638 // /* 639 // { 640 // "name": { 641 // "value": "liSi", 642 // "writable": false, 643 // "enumerable": true, 644 // "configurable": false 645 // }, 646 // "age": { 647 // "value": 18, 648 // "writable": false, 649 // "enumerable": true, 650 // "configurable": false 651 // } 652 // } 653 // */ 654 // // 判断对象是否为冻结状态,true时为冻结状态,false时为非冻结状态 655 // if (!Object.isFrozen(user)) { 656 // // 增加对象属性 657 // user.city = "shangHai"; 658 // // 删除对象属性 659 // delete user.name; 660 // // 修改对象属性 661 // user.age = 26 662 // } 663 // console.log(user); // {name: 'liSi', age: 18} 664 665 /*10.24 使用访问器保护数据*/ 666 /* 667 (1) getter 方法用于获得属性值,setter 方法用于设置属性,这是 JS 提供的存取器特性即使用函数来管理属性。 668 (2) 用于避免错误的赋值; 需要动态监测值的改变; 属性只能在访问器和普通属性任选其一,不能共同存在。 669 */ 670 // let user = { 671 // data : {name: "liSi", age: 18}, 672 // // 用set设置访问器,用于 673 // set age(value) { 674 // console.log("setAge"); 675 // if(typeof value !== "number" || value < 10 || value > 100) { 676 // throw new Error("年龄格式错误"); 677 // } 678 // this.data.age = value; 679 // }, 680 // get age() { 681 // console.log("getAge"); 682 // return this.data.age; 683 // } 684 // }; 685 // user.age = 88; // setAge 686 // console.log(user.age); // getAge 88 687 688 /*10.25 访问器伪造属性操作*/ 689 // let lesson = { 690 // lists: [ 691 // {name:"js",price: 100}, 692 // {name:"mysql",price: 212}, 693 // {name:"vue.js",price: 98}, 694 // ], 695 // get total() { 696 // return this.lists.reduce((t,l) => t + l.price,0); 697 // }, 698 // }; 699 // console.log(lesson.total); // 410 700 701 /*10.26 使用访问器批量设置属性*/ 702 // let web = { 703 // data : {name: "baidu", url: "www.baidu.com"}, 704 // set site(value) { 705 // [this.data.name, this.data.url] = value.split(","); 706 // }, 707 // get site() { 708 // return `${this.data.name}的网址是${this.data.url}`; 709 // }, 710 // }; 711 // console.log(web.site); // baidu的网址是www.baidu.com 712 // web.site = "sina,www.sina.com"; 713 // console.log(web.site); // sina的网址是www.sina.com 714 715 /*10.27 TOKEN的读写处理*/ 716 // const request = { 717 // set token(content){ 718 // localStorage.setItem('token',content) 719 // }, 720 // get token(){ 721 // const token = localStorage.getItem('token') 722 // if(!token){ 723 // alert('请登录') 724 // } 725 // return token 726 // } 727 // } 728 // request.token = 'ecdh8u38uu74lc891' 729 // console.log(request.token)//ecdh8u38uu74lc891 730 731 /*10.28 访问器的优先级*/ 732 /*10.28.1 访问器设置属性的优先级高于普通设置属性*/ 733 // let user = { 734 // // 普通属性 735 // name: "张三", 736 // // 访问器设置属性 737 // set name(value) { 738 // console.log(value + "-访问器"); 739 // }, 740 // age: 18, 741 // }; 742 // user.name = "李四"; 743 // console.log(user); // 李四-访问器 {age: 18} 744 745 /*10.28.2 未私有化data*/ 746 // let user = { 747 // // 普通属性 748 // data: {name: "张三"}, 749 // // 访问器设置属性 750 // set name(value) { 751 // this.data.name = value+"-访问器"; 752 // }, 753 // age: 18, 754 // }; 755 // user.name = "李四"; 756 // console.log(user); 757 // /* 758 // {data: {…}, age: 18} 759 // age: 18 760 // data: {name: '李四-访问器'} 761 // */ 762 // console.log(user.data.name); // 李四-访问器 763 764 /*10.28.3 私有化data*/ 765 // Symbol是唯一的 766 // console.log(Symbol() === Symbol()); // false 767 // const DATA = Symbol(); 768 // let user = { 769 // // 普通属性 770 // [DATA]: {name: "张三"}, 771 // // 访问器设置属性 772 // set name(value) { 773 // this[DATA].name = value+"-访问器"; 774 // }, 775 // age: 18, 776 // }; 777 // user.name = "李四"; 778 // console.log(user); 779 // /* 780 // {age: 18, Symbol(): {…}} 781 // age: 18 782 // Symbol(): {name: '李四-访问器'} 783 // */ 784 // console.log(user[Symbol()]); // undefined 785 786 /*10.29 构造函数中使用访问器*/ 787 // function User(name, age) { 788 // // 使用闭包变为私有化属性 789 // let data = {name, age}; 790 // Object.defineProperties(this,{ 791 // name: { 792 // set(value) { 793 // data.name = value; 794 // }, 795 // get() { 796 // return data.name; 797 // }, 798 // }, 799 // age: { 800 // set(value) { 801 // data.age = value; 802 // }, 803 // get() { 804 // return data.age; 805 // }, 806 // }, 807 // }); 808 // } 809 // let zhangSan = new User("张三",18); 810 // console.log(zhangSan.name); // 张三 811 // console.log(zhangSan.age); // 18 812 // console.log(zhangSan); // User{} 813 // zhangSan.name = "李四"; 814 // console.log(zhangSan.name); // 李四 815 // 816 // let wangEr = new User("王二", 29); 817 // console.log(wangEr.name); // 王二 818 // console.log(wangEr.age); // 29 819 820 /*10.30 JSON数据*/ 821 // let data = { 822 // name: "四川", 823 // city: { 824 // name: "成都", 825 // }, 826 // }; 827 // let json = JSON.stringify(data,null,2); 828 // console.log(json); 829 // /* 830 // { 831 // "name": "四川", 832 // "city": { 833 // "name": "成都" 834 // } 835 // } 836 // */ 837 // console.log(typeof json); // string 838 839 /*10.31 JSON序列化与自定义toJSON*/ 840 /*10.31.1 JSON序列化*/ 841 // let web = { 842 // title: "百度", 843 // url: "baidu.com", 844 // info: { 845 // describe: "中文搜索引擎", 846 // city: "北京", 847 // created_at: 2005, 848 // }, 849 // }; 850 // // 1 不添加参数的情况 851 // let json = JSON.stringify(web); 852 // console.log(json); // {"title":"百度","url":"baidu.com","info":{"describe":"中文搜索引擎","city":"北京","created_at":2005}} 853 // // 2 添加参数的情况 854 // // 参数一: 要转为json的数据;参数二: 数据转为json时要保留的属性;参数三: 数据转为json后的tab制表位 855 // let json1 = JSON.stringify(web,["title","url"],2); 856 // console.log(json1); 857 // /* 858 // { 859 // "title": "百度", 860 // "url": "baidu.com" 861 // } 862 // */ 863 864 /*10.31.2 自定义toJSON*/ 865 // let web = { 866 // title: "百度", 867 // url: "baidu.com", 868 // info: { 869 // describe: "中文搜索引擎", 870 // city: "北京", 871 // created_at: 2005, 872 // }, 873 // toJSON: function(){ 874 // return { 875 // title: this.title, 876 // city: this.info.city, 877 // }; 878 // }, 879 // }; 880 // let json = JSON.stringify(web,null,2); 881 // console.log(json); 882 // /* 883 // { 884 // "title": "百度", 885 // "city": "北京" 886 // } 887 // */ 888 889 /*10.32 JSON转为JS可操作类型*/ 890 // let web = { 891 // title: "百度", 892 // url: "baidu.com", 893 // info: { 894 // describe: "中文搜索引擎", 895 // city: "北京", 896 // created_at: 2005, 897 // }, 898 // }; 899 // // 1 将对象转换为JSON格式 900 // let json = JSON.stringify(web,null,2); 901 // console.log(typeof json); // string 902 // // 2 将JSON格式转换为对象 903 // let obj = JSON.parse(json); 904 // console.log(obj.info.city); // 北京 905 // // 3 对转换的格式进行处理 906 // let obj1 = JSON.parse(json, (key,value) => { 907 // if (key === "title") { 908 // value = "www-" + value; 909 // } 910 // return value; 911 // }); 912 // console.log(obj1); 913 // /* 914 // {title: 'www-百度', url: 'baidu.com', info: {…}} 915 // info: {describe: '中文搜索引擎', city: '北京', created_at: 2005} 916 // title: "www-百度" 917 // url: "baidu.com" 918 // */ 919 920 </script> 921 </body> 922 </html>