定义

  • 对象是 javascript 的一种数据类型,也是唯一一种复杂数据类型。
  • 一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

    语法

    可以用以下两种方法来声明一个对象

    1. let obj = { //常用写法
    2. 'name' : 'frank',
    3. 'age' : 18
    4. }
    5. let obj = new Object({ //正规写法
    6. 'name' : 'frank',
    7. 'age' : 18
    8. })

    对象的键名是字符串,可以省略,但省略后只能使用标识符

    原型

    原型包含了所有对象的共有属性,每一个对象都有原型,原型也是一个对象,对象的原型的原型是null
    对象的隐藏属性 proto 储存了原型的地址

    1. obj = {
    2. 'name' : 'frank',
    3. 'age' : 18
    4. __proto__:Object //隐藏属性
    5. }
    6. obj.__proto__.__proto__ === null; //true

    删除对象的属性

  • delete obj.xxx;delete obj[‘xxx’] (delete只可删除属性,不可删除对象。)

    1. let obj = {
    2. 'name' : 'frank',
    3. 'age' : 18
    4. }
    5. delete obj.name //delete obj['name']
    6. obj.name //undefined
    • obj.xxx不能判断对象中是否有该属性,用 ‘xxx’ in obj 判断对象中是否有该值(属性名一定要加引号
      1. let obj = {
      2. 'name' : undefined,
      3. 'age' : 18
      4. }
      5. obj.name === undefined //true
      6. delete obj.name
      7. obj.name === undefined //true 只能判断属性值是否相同
      8. 'name' in obj //false
      9. 'age' in obj //true

      查看自身属性

  • Object.keys(obj);Object.values(obj);Object.entries(obj)

    1. let obj = {
    2. 'name' : 'frank',
    3. 'age' : 18
    4. }
    5. Object.keys(obj) // ["name", "age"]
    6. Object.value(obj) // ["frank", 18]
    7. Object.entries(obj) // ["name", "frank"] ["age", 18]
  • 单个属性 obj.xxx;obj[‘xxx’];obj[xxx](变量)

    1. obj.name //"frank"
    2. obj['name'] //"frank"
    3. obj[name] //undefined //[]内无引号是变量 有引号才是字符串
    4. //未声明变量
    5. let key = 'name'
    6. obj[key] //"frank"
    • []里可以填变量,字符串或表达式
      1. let key = 'name';
      2. obj[key] = 'frank';
      3. obj['name'] = 'frank';
      4. obj['na' + 'me'] = 'frank';

      查看自身+共有属性

  • console.dir(obj)

    判断是自身属性还是共有属性

  • obj.hasOwnProperty() 返回布尔值

    1. let obj = {
    2. 'name' : 'frank',
    3. 'age' : 18
    4. }
    5. obj.hasOwnProperty('name') //true
    6. obj.hasOwnProperty('toString') //false

    改或增

    改自身属性

  • 改单个跟查语法相同

    1. obj.name = 'frank'
    2. obj['name'] = 'frank'
    3. let key = 'name'
    4. obj[name] = 'frank'
  • 批量赋值:Object.assign()

    1. Object.assign(obj,{age :18,gender:'man'})

    改原型

  • 一般不要修改原型 一定要改就在开始改,不要中途再改,会非常影响性能

  • Object.create();Object.prototype;obj.proto(不建议使用)

    1. let common = {
    2. '国籍': '中国',
    3. color: 'balck'
    4. }
    5. //方式一
    6. let person = Object.create(common)
    7. person.name == 'frank' //设置自有属性
    8. //方式二(不方便)
    9. let person = Object.create(common,{
    10. name:{value:'frank'}
    11. })
  • 改原型上的共有属性 Object.prototype.xxx;obj.proto.xxx(不建议使用)
    ```javascript let obj1 = {}; obj.toString = ‘空’; //只能修改自身属性 console.dir(obj); //toString:’空’ obj.toString; //f toString()

Object.prototype.toString = undefined; obj.toString; //undefined

  1. <a name="or5IC"></a>
  2. # 'name' in obj 和obj.hasOwnProperty的区别
  3. - in判断的是对象的所有属性,包括对象实例及其原型的属性;
  4. 而hasOwnProperty只判断对象实例的是否具有某个属性。
  5. ```javascript
  6. let obj = {
  7. 'name' : 'frank',
  8. 'age' : 18
  9. }
  10. 'name' in obj //true
  11. 'toString' in obj //true
  12. obj.hasOwnProperty('name') //true
  13. obj.hasOwnProperty('toString') //false