JS对象

1.使用点语法完成默认值设置和新值替换
利用的是同一对象中相同属性名后面的会覆盖前面的原理

    function fun (params) {
      let config = {
        name: '张三',
        age: 18
      }
      config = {...config, ...params} 
      return config
    }
    console.log(fun({age: 20})) //name: '张三', age: 20

2.使用解构语法来分解一个对象

    let user = {
      name: '张三',
      age: 18
    }
    let {name, age} = user //必须是一个对象才行
    console.log(name, age) //张三 18

3.使用解构语法完成默认配置对象与合并

	//这里的options一定要先赋值成一个对象,否则不能使用解构
	function createDom (options = {}) {
      let { width=200, height=200, backgroundColor="blue" } = options
      const div = document.createElement("div")
      div.style.width = width + 'px'
      div.style.height = height + 'px'
      div.style.backgroundColor = backgroundColor
      document.body.appendChild(div)
    }
    //传参就用参数,不传就用默认的
    createDom({width: 500})

4.对象的增删操作

	let obj = {
      name: '张三'
    }
    obj.age = 18
    console.log(obj) //{name: 张三, age: 18} 增
    delete obj.age
    console.log(obj) //{name: 张三} 删

5.查看对象原型中是否含有某个属性

	let user = {
      name: '张三'
    }
    let age = {
      age: 18
    }
    console.log(user.hasOwnProperty('age')) //查自己
    Object.setPrototypeOf(user,age) //改变自己的上级
    console.log('age' in user) //查自己和上级

6.使用assign来将两个对象合并为一个对象

    function merge (params) {
      let options = {
        size: 100
      }
      let newMerge = Object.assign(options, params)
      return newMerge
    }
    console.log(merge({name: '大小', size: 200}))

7.浅拷贝与深拷贝
浅拷贝就是普通的赋值,一旦拷贝的对象里面还有一个对象,那么新的对象与旧的会共用一个地址值,一旦发生改变就会都改变。
而深拷贝就会重新定义一块内存地址,这样就只会改变目标对象而不是全改

    let obj = {
      name: "张三",
      user: {
        name: "李四"
      },
      data: []
    };

    function copy(object) {
      let obj = object instanceof Array ? [] : {};
      for (const [key, value] of Object.entries(object)) {
        obj[key] = typeof value == "object" ? copy(value) : value
      }
      return obj
    }
    let res = copy(obj);
    res.data.push("abc");
    console.log(JSON.stringify(res, null, 2))
    console.log(JSON.stringify(obj, null, 2))

8.工厂函数

    function fun (name, age) {
      return {
        name,
        age,
        showAge () {
          console.log(`${name}的年龄是${age}`)
        }
      }
    } 
    let zs = fun ('张三', 18)
    let lisi = fun ('李四', 28)
    console.log(zs) //{name: "张三", age: 18, showAge: ƒ}
    console.log(lisi) //{name: "李四", age: 28, showAge: ƒ}
    lisi.showAge() //李四的年龄是28

9.抽象
当函数内部有些东西不希望用户发现或改变时就需要把它抽象化

    function User (name, age) {
      let info = {name, age} //封装成变量而已
      let showInfo = function () {
        return age >= 18 ? '成年' : '未成年'
      }
      this.show = function () {
        console.log(`${info.name}是个${showInfo()}`)
      }
    }
    let zs = new User('张三', 18)
    console.log(zs)
    zs.show()

10.对象的属性特征
不带S就是查看一个(属性要加上""), 带S就是查看所有

    let obj = {
      name: '张三',
      age: 18
    }
    console.log(JSON.stringify(Object.getOwnPropertyDescriptor(obj, "name"), null, 2))
    console.log(JSON.stringify(Object.getOwnPropertyDescriptors(obj), null, 2))

11.修改对象的属性特征

    let obj = {
      name: '张三',
      age: 18
    }
    Object.defineProperties( obj, {
      name: {
        value: '张三',
        writable: false, //是否可以重新改
        enumerable: false, //是否可以枚举
        configurable: false //是否可以设置
      },
      age: {
        value: '18',
        writable: false,
        enumerable: false,
        configurable: false
      }
    })
    console.log(JSON.stringify(Object.getOwnPropertyDescriptors(obj), null, 2))

12.系统自带的控制增删改属性的API和判断是否可以增删改

    let obj = {
      name: '张三',
      age: 18
    }
    Object.preventExtensions(obj) //这样就不能往里面增删改
    if(Object.isExtensible(obj)){ //会判断是否可以增删改并返回布尔值
      obj.gender = '男'
    }
    console.log(obj)

13.封闭对象
跟上面那个一样

    let obj = {
      name: '张三',
      age: 18
    }
    // Object.seal(obj)
    if(!Object.isSealed(obj)){
      obj.gender = '男'
    }
    console.log(obj)

14.冻结
跟上面一样,但范围更广

    let obj = {
      name: '张三',
      age: 18
    }
    // Object.freeze(obj)
    if(!Object.isFrozen(obj)){
      obj.gender = '男'
    }
    console.log(obj)

15.访问器保护数据
当数据被调用时会触发get方法,
当数据被操作时会触发set方法

    let obj = {
      data: {name: '张三',gender: '男',age: 18},
      set age (value) {
        if( typeof value!== 'number' || value<10 || value>100){
          throw new Error ('大胆妖孽,竟然班门弄斧,大威天龙')
        }
        this.data.age = value
      },
      get age () {
        return this.data.age + '岁'
      }
    }

    obj.age = 30
    console.log(obj.age)

16.使用代理来完成积成算法

    function factorial (num) {
      return num === 1 ? 1 : num * factorial (num-1)
    }
    let proxy = new Proxy (factorial,{
      apply (fun, obj, args) { //factorial,window,传过来的参数
        console.time("run")
        fun(args)
        console.timeEnd("run")
      }
    })
    proxy.apply(this, [5])

17.通过代理完成双向数据绑定

  <input type="text" v-model="title">
  <input type="text" v-model="title">
  <p v-bind="title">同样发生改变</p>
  <script>
    // "use strict"
    
    function View () {
      let proxy = new Proxy (
        {},
        {
        get (obj, property) {},
        set (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()

18.使用代理完成表单验证

  <style>
    .error{
      border: 5px red solid;
    }
  </style>
 <input type="text" validate rule="max:12,min:3">
  <input type="text" validate rule="max:3,isNumber">

  <script>
    //验证处理类
    class Validate {
      max (value, len) {
        return value.length <= len
      }
      min (value, len) {
        return value.length >= len
      }
      isNumber (value) {
        return /^\d+$/.test(value)
      }
    }
    function makeProxy (target) {
      return new Proxy (target, {
        get (target, key) {
          return target[key]
        },
        set (target, key, el) {
          const rule = el.getAttribute("rule")
          const validate = new Validate()
          let state = rule.split(",").every(rule => {
            const info = rule.split(":")
            return validate[info[0]](el.value, info[1])
          })
          el.classList[state ? "remove":"add"]("error")
        }
      })
    }
    const proxy = makeProxy (document.querySelectorAll("[validate]"))
    proxy.forEach ((item, i) => {
      item.addEventListener("keyup", function(){
        proxy[i] = this
      })
    })

19.JSON序列化和反序列化
序列化
第一个参数为要序列化的对象,
第二个参数为被传递的具体属性,null就是全部传递
第三个参数就是前面有几个空格
反序列化
第一个参数为要反序列化的JSON
第二个参数可以是个函数

    let obj = {
      name: '张三',
      age: 18,
      gender: {
        zs_gender: '男' //对象中的对象不会被序列化!!!
      }
    }
    let json = JSON.stringify(obj, ["name", "gender"], 2) 
    console.log(json)
    let newobj = JSON.parse(json, (key, value) => {
      if(key === "name"){
        value = `他的名字叫${value}`
      }
      return value
    })
    console.log(newobj)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
### 回答1: JavaScript对象编程是指使用JavaScript语言创建和操作对象的过程。在JavaScript中,对象是一种复合数据类型,可以包含属性和方法。对象可以通过字面量、构造函数、原型等方式创建。通过对象编程,可以实现面向对象编程的思想,使代码更加模块化、可维护和可扩展。在JavaScript中,对象是非常重要的概念,掌握对象编程是成为一名优秀的JavaScript开发者的必备技能之一。 ### 回答2: JavaScript是一种流行的编程语言,其中面向对象编程(OOP)是其中的重要组成部分。对象是JavaScript编程中最重要的概念之一,它是一种数据类型,通过对象可以轻松地组织和管理数据。JS对象包含了一组属性和方法,可以用来描述某个对象的性质和行为。 在JavaScript中,对象是动态创建的。创建对象的方法有很多,其中最简单的就是使用字面量,例如: var person = { name: 'Tom', age: 20, gender: 'male', sayHi: function() { console.log('Hi, my name is ' + this.name + ',I am ' + this.age + ' years old.') } }; 上面的代码定义了一个名为person的对象,该对象具有属性name、age、gender和方法sayHi。使用字面量创建对象的好处是,可以轻松地在代码中定义对象,而无需使用专门的构造函数。 当然,也可以使用构造函数来创建对象,例如: function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayHi = function() { console.log('Hi, my name is ' + this.name + ',I am ' + this.age + ' years old.') } }; var person = new Person('Tom', 20, 'male'); 上面的代码定义了一个名为Person的构造函数,在创建对象时使用了new关键字来调用该构造函数,返回一个新的person对象。这个对象包含了属性name、age、gender和方法sayHi。 在JavaScript中,对象是可以嵌套的。可以在对象中嵌套其他对象,也可以在对象中嵌套函数,这些函数就是对象的方法。通过对象的嵌套,可以更好地管理数据,使程序更加规范和易于维护。 总之,JavaScript的对象编程是一种强大且灵活的编程方式,通过对象可以轻松地组织和管理数据,从而实现更好的开发效率和代码质量。由于JavaScript的广泛应用,对于对象编程的掌握将有助于开发者更好地掌握这门语言。 ### 回答3: 在JavaScript中,对象是一种基础数据类型,也是语法的重要组成部分。对象是由若干属性构成的,每个属性都是键值对的形式,其中键是字符串类型,值可以是任意的JavaScript数据类型,包括对象。通过定义对象的属性和方法,我们可以在JavaScript中创建功能强大的程序。 JavaScript对象编程有以下几个重要概念: 1. 对象字面量:使用“{}”来定义对象,字符:“:”分割键与值,“,”分割不同键值对。如:var obj = {name: "小明", age: 18}; 2. 访问对象属性:使用“.”操作符访问对象属性。如:obj.name 3. 新增属性:使用“.”或“[]”,如:obj.height = 180; 或 obj['sex'] = 'male'; 4. 删除属性:使用“delete”关键字,如:delete obj.age; 5. 遍历对象属性:使用“for...in...”语句遍历对象属性,如: for(var key in obj) { console.log(key + ": " + obj[key]); } 6. 面向对象编程:JavaScript中也可以实现面向对象编程。定义一个构造函数,然后使用“new”关键字创建对象实例,如: function Person(name, age) { this.name = name; this.age = age; this.sayHello = function () { console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old."); } } var p = new Person('小明', 18); p.sayHello(); // 输出:Hello, my name is 小明, I'm 18 years old. JavaScript对象编程是非常灵活的,我们可以根据需要动态地定义、操作对象,同时结合面向对象编程,使得JavaScript的代码结构更加清晰有序。掌握好JavaScript对象编程的技巧,可以让我们开发出更高效、更具有扩展性的项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值