0. 前言
对象是JavaScript(以下简称JS)的“三座大山”之一,对于理解JS是关键一步。不过对于我这种前Python程序员来说,这一块内容虽有点绕,但不难。
不过鉴于不能将Java或Python中的面向对象思想完全移植到JS中,所以还是开篇博客来写一个学习笔记。
1. JavaScript与传统的面向对象语言需要区分的部分
以下部分纯个人经验之谈:
- Python是一门灵活的语言,既可以写成函数式编程的方法,也可以写成面向对象的套路
- JavaScript是完全的万物皆对象语言,除了基本数据类型外的类型皆为对象(Object)类型,所以我愿称之为“全对象语言”。
2. 对象及定义方法
JS的对象和Python中的字典(dict)有些类似,都是键值对(key-value)的集合,它的特点是无序。
在JS中定义对象有两种方法,并且完全等价:
// 简写
let obj = {
'name' : 'Allen',
'age' : '22'
};
// formal
let obj2 = new Object({
'name' : 'Allen',
'age' : '22'
})
复制代码
一般能看到的是第一种,但第二种更为正式一些。不过还是推荐第一种写法。
有几点需要注意:
- 键名(key)必须是字符串。
- 不过,在定义键名时可以省略字符串,但不推荐这样做
- 如采用上面一条的方法定义字符串,那么键名按照标识符的方法来写(即怎么定义变量就怎么定义key)
3. CRUD(即增删改查)
任何事情最后都逃不过CRUD(增删改查的英文是CRUD,即”创建(Create)、 读取(Read)、 更新(Update)和删除(Delete)),JS中的对象也name是这样。
3.1 查
查看对象属性是后面一切操作的基础,所以先说这个。
两种方法:
obj.name // Python式查看方法
obj['name'] // JS式查看方法,推荐使用
复制代码
注意,obj[name]
也可以,但其中的name
指向一个变量name
而非字符串'name'
。示例:
let n = 'name';
obj[n] //注意上面的n
复制代码
3.2 删
用delete
语句即可。示例:
delete obj.name
// or
delete obj['name']
复制代码
3.3 增与改
直接写就行,下面语法的功能除了增就是改,没别哒~示例:
obj.name = 'Fiona'
// or
obj['name'] = 'Fiona'
复制代码
如原对象obj
中无name
,则添加;如有,则改写。
不过,如果批量添加的话,Object.assign
倒是个不错的选择。语法如下(例子来源于MDN):
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
复制代码
上面代码的意思是,将source
与target
合并。
4. ‘name’ in obj和obj.hasOwnProperty(‘name’) 的区别
其实从语义上就能看出,前者用于判断对象obj
中是否有某项属性;后者用于判断name
是否为非原型的属性,即可以理解为判断name
是不是从Object
继承来的属性。
const obj = {};
obj.hasOwnProperty('toString')
// output: false
'toString' in obj
// output: true
复制代码
解释:
- 因为
toString
是Object
的公共属性,也就是obj
从Object
父类继承下来的,不是它自己的,所以obj.hasOwnProperty('toString')
会输出false
; - 而对于
'toString' in obj
语法来说,只有toString
是有效属性/方法,不管它是自己的还是继承自父类的,都是true
。
上图:
References
- [1] MDN文档–assign
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END