其他分享
首页 > 其他分享> > 对象

对象

作者:互联网

定义

对象可以通过两种方式定义:

声明(文字)形式 & 构造形式

// 文字声明语法
var myObj = {
  key: value
}

// 构造形式
var myObj = new Object();
myObj.key = value;

引用

引用对象中的内容有两种方法:

const myObject = {
  a: 2333
};

// 属性访问
myObject.a;   // 2333

// 键访问
myObject["a"];   // 2333
属性访问要求属性名满足标识符的命名规范,而键访问语法可以接受任意UTF-8/Unicode字符串作为属性名
键访问常被用于获取可变量属性值

同时,键访问可以接受 “可计算属性名”

const prefix = 'foo',
      myObject = {
          [prefix + 'bar']: 'hello',
          [prefix + 'baz']: 'world'
      };

myObject['foobar'];     // hello
myObject['foobaz'];     // world

数组

对象数组支持 “[ ]” 的访问方式

数组也是对象,即也可以用属性访问和键访问进行新增属性,对象属性并不会影响数组length的变化

const myArray = ['foo', 42, 'bar'];
myArray.baz = 'baz';
myArray.length;     // 3
myArray.baz;      // baz

使用 “[ ]” 方法新增数组内容

const myArray = [1, 2, 3];
myArray[3] = 4;

myArray;      // [1, 2, 3, 4]

复制对象

对于JSON安全的对象来说,有一种巧妙的复制方法
这种方法需要保证对象是JSON安全的,因此只适用于部分情况

var newObj = JSON.parse(JSON.stringify(someObj));

浅复制 Object.assign()

ES6定义了 Object.assign() 方法实现浅复制。
该方法接收两个参数,第一参数是目标对象,之后还可以跟一个或多个源对象。

属性描述符

var myObject = {
  a: 2
}

在创建普通属性时属性描述会使用默认值,例如上面的代码创建的不仅仅是2,还包含了另外的三个特性:

  • writable (可写,属性值可被修改)
  • enumerable (可枚举,属性可被遍历出来)
  • configurable (可配置,属性描述符配置可被修改)

使用 Object.defineProperty() 方法来添加/修改对象属性

var myObject = {};

Object.defineProperty(myObject, 'a', {
  value: 2,
  writable: true,
  configtarble: true,
  enumerable: true
});

myObject.a;   // 2
1. Writable

决定是否可以修改属性的值

2. configurable

决定属性是否是可配置的

即便属性是 configurable: false ,我们还是可以把writable的状态由true改为false,但是无法由false改为true!

把configurable修改成false是单向操作,无法撤销。

除了无法修改, configurable: false 还会禁止删除(delete)这个属性

3. Enumerable

属性是否会出现在对象的属性枚举中,即属性是否能被遍历出来

不变性

所有的方法创建的都是浅不变性,即他们只会影响目标对象和它的直接属性。深不变性指的是创建的内容是不可改变的,js中很少需要深不可变性

1. 对象常量

结合 writable:false 和 configurable:false 就可以创建一个真正的常量属性 (不可修改、重定义or删除)

2. 禁止扩展

禁止一个对象添加新属性且保留已有属性,使用如下方法
Object.preventExtensions()

3. 密封

Object.seal() 会创建一个“密封”的对象
这个方法会在一个现有对象上调用 Object.preventExtensions() 并把所有现有属性标记为configurable:false

所以密封之后不仅不能添加新属性,也不能重新配置or删除任何现有属性,虽然可以修改属性的值

4. 冻结

Object.freeze() 会创建一个冻结对象
这个方法实际上会在一个现有对象上调用 Object.seal() 并把所有“数据访问”属性标记为writable:false,这样就无法修改它们的值

Getter和Setter

对象默认的【【Put】】和【【Get】】操作分别可以控制属性值的设置和获取
getter是一个隐藏函数,会在获取属性值时调用。
setter也是隐藏函数,会在设置属性值时调用

定义getter和setter,可以覆盖单个属性的默认的【【Put】】操作。
通常getter和setter是成对出现的,只定义一个的话通常会出现意料之外的行为

var myObject = {
  // 给a定义一个getter
  get a() {
    return this._a_;
  },
  
  // 给a定义一个setter
  set a(val) {
    this._a_ = val * 2;
  }
};

myObject.a = 2;

myObject.a;   // 4

对象小结

1. js对象有字面形式和构造形式。其中字面形更常用,构造形式能提供更多选项
2. 对象是6个(7个)基础类型之一。对象有包括function在内的子类型,不同子类型具有不同的行为。
3. 对象是键/值对的集合。可以通过 .propName或者["propName"]语法来获取属性值
4. 属性的特性可以通过属性描述符来控制,例如 writable 和 configurable。此外,可以使用 Object.preventExtensions()、Object.seal() 和 Object.freeze() 来设置对象(及其属性)的不可变性级别。
5. 属性不一定包含值————它们可能是具备了getter/setter的“访问描述符”。
6. 属性可以是可枚举or不可枚举,这决定了它们是否会出现在 for..in 循环中
7. 使用ES6的 for..of 语法来遍历数据结构(数组、对象等等)中的值,for..of 会寻找内置或者自定义的 @@iterator对象并调用它的 next() 方法来遍历数据值

对象解构

解构,个人理解即将对象内的数据直接绑定到新声明的变量中。

// 解构目标测试对象
const testObject = {
    a: 1,
    b: 2,
    c: 3
}

解构方案一

直接将测试对象中的属性赋值到新声明变量中

// 解构testObject对象
const { a, b, c } = testObject;
console.log(a, b, c);	// 1, 2, 3

解构方案二

将测试对象中的属性放到 testArray 数组中

const testArray1 = [...testObject];
console.log(testArray1);		// [1, 2, 3]

// 面对复杂的测试对象
const testComplexObject = {
    a: {
        a1: 1,
        a2: 2,
        a3: 3
    },
    b: {
        b1: 1,
        b2: 2,
        b3: 3
    }
}
const testArray2 = [...testObject];
console.log(testArray2);		// [{a1: 1, a2: 2, a3: 3}, {b1: 1, b2: 2, b3: 3}]

标签:myObject,false,对象,Object,const,属性
来源: https://www.cnblogs.com/CreateBox/p/15194624.html