javaScript

对象、类和面向对象编程

1.理解对象

创建自定义对象的通常方式就是创建 Object 的一个新实例,然后给它添加属性和方面;例如:

构造函数创建对象

// 这个例子创建了名为 person 的对象,有三个属性:name、age、job 和一个方法 sayName()
    let person = new Object()
    person.name = '张三';
    person.age = 20;
    person.job = '程序员';
    person.sayName = function() {
      console.log(this.name)
    }

字面量创建对象

    // 字面量创建对象 --- 当下比较流行的创建对象方法,等价于上面的创建方法
    let person = {
      name: '李四',
      age: 22,
      job: '程序员',
      sayName() {
        console.log(this.name);
      }
    }

1.1 属性的类型

ES6使用了一些特性来描述属性的特征。这些特性是由JS实现引擎的规范定义的。所以,开发者不能在js中访问这些特性。为了将某些特性标识为内部特性,规范用[[ ]] 两个中括号把特性括起来。

1.数据属性

数据属性包含一个保存数据的位置。只会从这个位置读取,也会写入这个位置;数据属性有4个特性描述他们行为。

  • [ [ Configurable ] ] : 表示属性可以通过 delete 删除并重新定义,是否可以修改他的特性,以及是否可以把他变为可访问属性。默认情况下,所有直接定义在对象上的属性都是 true,包括字面量和构造函数创建对象;
  • [ [ Enumberable ] ] : 表示属性可以通过 for - in 循环返回。默认情况下,所有直接定义在对象上的属性都是 true,包括字面量和构造函数创建对象;
  • [ [ Writeable ] ] : 表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性都是 true,包括字面量和构造函数创建对象;
  • [ [ Value ] ] : 包含实际属性的值。这个特性默认是 undefined
    在前面构造函数和字面量创建对象的时候,将属性显示的添加给对象之后,[ [ Configurable ] ][ [ Enumberable ] ][ [ Writeable ] ]都会被设置为 true ,而 [ [ Value ] ] 会被设置为指定的值。
let person = {
	name: '王五'
}

这里,创建一个 name 的属性,并且给他一个值 ‘王五’,这就代表 [ [ Value ] ] 的这个特性被设置为 ‘王五’,之后对这个值的任何修改都会保存到这个位置。
要修改属性的默认特性,就得使用一个 API ,Object.definedProperty() 。这个方法接收三个参数,第一个参数 — 要给其添加属性的对象,第二个参数 — 属性的名称,第三个参数 — 一个描述符对象。
最后一个参数,可以包括数据属性的4个特性,但需要跟相关特性的名称一一对应,可以设置一个或多个值。

    let obj = {}
    Object.defineProperty(obj, 'name', {
      writable: false, // 此处设置属性的值不允许修改,表示只是可读的
      value: '张无忌'
    })
    console.log(obj.name); // 张无忌
    obj.name = '张三丰'
    console.log(obj.name);  // 张无忌

在普通模式下修改不报错,在严格模式下修改会报错。

创建不可配置的属性

    let obj = {}
    Object.defineProperty(obj, 'name', {
      configurable: false, // 不可以删除,不可以修改
      value: '张无忌'
    })
    console.log(obj.name); // 张无忌
    delete obj.name
    console.log(obj.name);  // 张无忌

可以对同一个属性多次调用 Object.definedProperty() ,但是一旦 configurable 被设置为 true之后就会报错。

    let obj = {}
    Object.defineProperty(obj, 'name', {
      configurable: false,
      value: '张无忌'
    })
    Object.defineProperty(obj, 'name', {
      configurable: true,
      value: '张无忌'
    })
2.访问器属性

访问器属性不包含数值。它包含两个可选的函数,一个获取(getter)和一个设置(setter)。读取访问属性的时候,调取获取函数,这个函数的责任返回一个有效的值。在修改或者说写入访问属性时,调用设置函数,并传入新值,这个函数必定要做的事就是对数据做出什么修改。

  • [ [ Configurable ] ] : 表示属性可以通过 delete 删除并重新定义,是否可以修改他的特性,以及是否可以把他变为可访问属性。默认情况下,所有直接定义在对象上的属性都是 true,包括字面量和构造函数创建对象;
  • [ [ Enumberable ] ] : 表示属性可以通过 for - in 循环返回。默认情况下,所有直接定义在对象上的属性都是 true,包括字面量和构造函数创建对象;
  • [ [ Get ] ] : 获取函数,在读取时调用,默认值为 undefined
  • [ [ Set ] ] : 设置函数,在设置时调用,默认值为 undefined
    访问器函数不能直接定义,必须使用 Object.definedProperty()
    let book = {
      year_: 6,
      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

对象有两个属性, year_edition year_ 中的下划线表示并不希望在对象方法外部被访问到。
获取和设置不一定都要定义。之定义获取那就代表属性只读,修改属性会被忽略。严格模式下会报错。

1.2 定义多个属性

在一个对象上定义多个属性。可以调用一个 API, Object.definedProperties() ,这个方法可以通过多个描述符一次性定义多个属性。接受俩个参数,一个为要添加或者修改属性的对象,另一个为描述符。

1.3 读取属性的特性

1.4 合并对象

1.5 对象标识及相等判定

1.6 增强对象的语法

1.属性值的简写

对象一般以键值对的形式呈现,如果键名和键值一样就可以简写为一个。

let name = '张三'
let obj = {
  name: name
}
let obj1 = {
  name
}
console.log(obj,obj1);
// {name: '张三'} {name: '张三'}
2.可计算属性
3.简写方法名
1.7 对象结构
1.嵌套结构
2.部分结构
参数上下文匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赊酒与梦_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值