后盾人:JS课程第十章(对象)

1.函数编程与面向对象的实例对比

let user = {
  name: "XJ",
  grade: [
    {name: "js", score: 99},
    {name: "css", score: 88},
  ],
  average() {
    let total = this.grade.reduce((t, v) => t + v.score, 0)
    return `${this.name}的成绩:${total}`
  }
}
console.log(user.average());

所有和用户user相关的内容(数据、方法等)都放在user对象中

2.属性基本操作

let user = {
  name: "XJ",
  "age name": 18,
  }
user.name 
user["age name"]
//两种方法都可以获取值。常用第一种

3.解构

  解构默认值实现配置合并

function createElement(options = {}){
  let {width=200,height=100,background='red'} = options
  const div = document.createElement("div")
  div.style.width = width + "px"
  div.style.height = height + "px"
  div.style.backgroundColor = background
  document.body.appendChild(div)
}
createElement({width:120})

4.Object.assign(a,b)  //合并对象 

5.对象的封装和抽象

function User(name, age){
    let data = {name, age } //使用闭包特性对属性进行了抽象化处理
    let info = function(){return data.age > 30 ? "中年":"青年"}
    this.show = function(){
      console.log(`${data.name}的年龄${info()}`);
    }
}
let lisi = new User("李四", 30)
lisi.name = "张三" //此处不会改变构造函数lisi的值
lisi.info = function() {  //此处不会改变构造函数lisi内的方法
  return ""
}
lisi.show() //输出“李四的年龄青年”

 6.对象属性的特征

Object.entries(arr)   返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。索引为 key, 元素为 value。

Object.getOwnPropertyDescriptor("对象", "对象的属性")  查看元素的属性特征,

Object.getOwnPropertyDescriptors("对象")  查看元素的所有属性特征,

属性的特征

{
“value”: “值”
“writable”: true//对应属性是否可以写,
“enumerable”:true//对应属性时候可以遍历/Object.key()是否可以获取
“configurable”: true //对应属性是否可以被删除/是都可以重新设置
}

 控制属性特征

Object.defineProperty(对象, 属性, { 特征设置 })

 
禁止向对象添加属性
Object.preventExtensions(对象)
Object.isExtensible(对象)   //判断是否被禁止添加属性
 
封闭对象
 Object.seal(对象)
Object.isSealed(对象) //判断时候封闭
 
冻结对象
Object.freeze(对象)
Object.isFrozen(对象) 判断是否冻结
 
7.访问器
set 属性 {}  //修改属性时限制
get 属性 {}  //获取属性时限制
 访问器伪属性操作
let lesson = {
   lists: [
     {name: "js", price: 100 },
     {name: "php", price: 99 },
   ],
   get total() {
     return this.lists.reduce((t, l) => t + l.price, 0)
   }
 }
 console.log(lesson.total); //199
 lesson.total = 8000  //不会改变total伪属性
 console.log(lesson.total); //199

访问器的优先级更高

8.对象代理 proxy

 基本语法:new Proxy(对象, {方法})

 使用代理实现 Vue 的双向绑定

<body>
  <input type="text" v-model="title">
  <input type="text" v-model="title">
  <button v-bind="title">
    添加
  </button>
  <hr><br>
  <input type="text" v-model="content">
  <input type="text" v-model="content">
  <button v-bind="content">
    添加
  </button>
</body>
<script>
  function View() {
    let proxy = new Proxy(
      {},
      {
        get(obj, property) { },
        set(obj, property, value) { //obj {}  //property 传入的值 //value传入的值
          document.querySelectorAll(`[v-model="${property}"]`).forEach(item => {
            item.value = value  
          })
          document.querySelectorAll(`[v-bind="${property}"]`).forEach(item => {
            item.innerHTML = value
          })
        }
      })
    this.init = function () {
      const els = document.querySelectorAll("[v-model]");
      els.forEach(item => {
        item.addEventListener("keyup", function () {
          proxy[this.getAttribute("v-model")] = this.value  
        })
      })
    }
  }
  new View().init()
</script>
 
posted @ 2021-09-01 17:37  人才不才  阅读(104)  评论(0编辑  收藏  举报