实践篇-—JS对象基本用法

JS对象基本用法

重点

  1. 声明对象的两种语法
  2. 如何删除对象的属性
  3. 如何查看对象的属性
  4. 如何修改或增加对象的属性
  5. ‘name’ in obj和obj.hasOwnProperty(‘name’) 的区别

TL;DR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 删
delete obj['name']
'name' in obj //查是否含有name属性
obj.hasOwnProperty('name') //查name属性是否时自由属性

// 查
Object.keys(obj)
console.dir(obj)
obj['name']
obj.name // 记住这里的 name 是字符串
obj[name] // 记住这里的 name 是变量

// 改和增
obj['name'] = 'jack' //改自身
Object.assign(obj, {age:18, ...}) //批量改自身
Object.prototype['toString'] = 'xxx' //改共有属性
let obj = Object.create(common) //改原型

对象的声明

键值对

1
2
3
4
5
6
let obj = {'name':'andy8421','age':18};
let obj = new Object{'name':'andy8421'};

//以变量做为属性名
let x = 'name';
let obj = {[x]:'andy8421'} //key值是变量x,x为'name'

不能使用let obj = {x:'andy8421'};,这样得到的key值为字符串x,不是变量x。

  • 键名是任意字符组成的字符串,不是标识符
  • 引号可以省略。若省略引号,则只能写标识符
  • 省略引号,键名仍然是字符串

对象的隐藏属性

  1. JS中每一个对象都有一个隐藏属性(__proto__

  2. 这个隐藏属性储存着共有属性所组成对象的地址

  3. 这个共有属性组成的对象叫原型

  4. 隐藏属性存储着原型的地址

原型

  1. 每个对象都有原型
    1. obj的原型就是一个对象
    2. obj.__proto__存着这个对象的地址
    3. 这个对象(即原型)里有toString/valueOf/constructor等属性(即共有属性)
  2. 原型里存着对象的共有属性
  3. 对象的原型也是对象
  4. 所以对象的原型也由原型
    1. obj的原型,即obj.__proto__,为所有对象的原型
    2. 这个原型包含所有对象的共有属性,是对象的
    3. 这个原型也有原型(对象的根的原型),但是值为null。obj.__proto__.__proto__===null(浏览器查不到这个属性,因为值为null)

图中,#8421和#1024分别指向的就是Object和Array两个原型,它们分别含有toString()和push(),这两个方法并不是obj和arr自身的属性,而是obj和arr两个对象的原型obj.__proto__arr.__proto__的属性,称为共有属性。

对象属性的增删改查操作

删除对象的属性

1
2
3
let obj = {key1:'value1','key2':`value2`};

delete obj.key1; //正确删除对象的属性方法

不能使用obj.key1 = undefined;。它只是将obj的key1值设置为undefined,并不能删除obj的key1属性。

查看对象的属性(读)

in判断对象是否含有某个属性(一般用于判断属性是否被删除):

1
2
3
4
5
'xxx' in obj;	//return:false表示obj不含有xxx属性。(反之含有)

'xxx' in obj && obj.xxx; //return:undefined表示obj含有xxx属性,但是属性值为undefined。
//如果return:false则表示同上一句,不赘述。
//这证明了为什么删除属性xxx不能使用obj.key1 = undefined;

使用in时,前面待判断key值引号不能省,否则表示变量xxx。

证明: 对象的根存在原型,且该原型值为null:

1
2
3
4
let obj = {};

'__proto__' in obj.__proto__; //return:true;
obj.__proto__.__proto__===null; //return:true;

查看属性的键值对:

1
2
3
4
5
6
7
8
9
10
let obj = {key1:'value1','key2':`value2`};

//查看自身属性
Object.values(obj); //return:obj的所有属性值
Object.keys(obj); //return:obj的所有key值
Object.entries(obj); //return:obj的所有由键值对组成的数组

//查看自身属性和共有属性
console.dir(obj);
obj.__proto__; //不规范,不推荐

判断一个属性是自身属性还是共有属性:

1
2
obj.hasOwnProperty('key1');		//true
obj.hasOwnProperty('toString'); //false

不能使用'xxx' in obj;。它只是判断对象是否含有某个属性,不能判断是否为自有属性。

查看单个属性的key值:

1
2
3
4
5
6
7
let obj = {key1:'value1','key2':`value2`};

/* 等价写法 */
//中括号语法:
obj['key1'];
//点语法:
obj.key1;

错误语法:obj[key1];,这表示变量key1,而不是字符串key1。

增加或修改对象的属性(写)

直接赋值:

‘name’ in obj和onj.hasOwnProperty(‘mame’)的区别

1
2
3
4
5
6
7
8
let obj = {name: 'andy8421'} ;		// name 是字符串
obj.name = 'andy8421'; // name 是字符串
obj['name'] = 'andy8421';
obj[name] = 'andy8421'; // 错,此处name为变量
obj['na'+'me'] = 'andy8421';

let key = 'name'; obj[key] = 'andy8421';
let key = 'name'; obj.key = 'andy8421'; // 错,这表示给obj增加一个属性key,值为andy8421。

批量赋值:

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

修改或增加共有属性

  • JS默认设定共有属性为只读属性。
  • 无法通过对象自身修改或增加共有属性(修改最终指作用于对象本身,不影响原型)

强行修该原型的属性的方法:

1
2
obj.__proto__.toString = 'xxx';			// 不推荐用 __proto__
Object.prototype.toString = 'xxx';

修改对象原型的方法(修改原型链):

1
2
3
4
5
6
7
8
9
10
//不推荐使用__proto__
//推荐使用Object.create
let obj = Object.create(common); //以common为原型创建对象obj
obj.key = 'value';

//或者
let obj = Object.create(common,{
key:{value:'value'}
...
});

版权声明:本文作者为「Andy8421」.本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!