js 对象
分类:javascript
object 对象
什么是对象? 简单说,对象就是一组"键值对"(key-value)的集合,是一种无序的复合数据集合;
//object的写法
let obj = {
foo: 'Hello',
bar: 'World'
};
let obj = new Object({'name':'frank'})
console.log({'name':'frank','age':18})
- 定义
- 无序的数据集合
- 键值对的集合
- 细节
- 键名是字符串,不是标识符,可以包含任意的字符
- 引号可以省略,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串
- 键只能是字符串,不管写不写"引号"
- object.keys() 获取obj的所有key
- 变量作属性名
- 想要用变量,当对象的键 可以[].
let a = '我是变量'
let obj = {
[a]:333
}
//得到的是 obj{'我是变量':333}
对象的隐藏属性
- 隐藏属性
- js 中没一个对象都有一个隐藏属性
- 这个隐藏属性储存着共有属性组成的对象的地址
- 这个共有的属性组成的对象叫做原形
- 应酬属性储存着原型的地址
- 代码示例
var obj ={}
obj.toString()//没有报错
//因为obj的隐藏属性对应的对象上有toString();
- 图解
原型
- 每个对象都有原型
- 原型里面存着对象的原型
- 比如 obj 的原型就是一个对象
- obj.__proto__存着这个对象的地址
- 这个对象里面有 toString/constructor/valueof等属性
- 对象的原型也是对象
- 所以对象的原型也是原型
- obj ={}的原型即为所有对象的原型
- 这个原型包含所有对象的共有属性,是对象的根
- 根这个对象也是有原型的,是null
- 查看/读的时候会去 原型/共有属性中去查看,
- 但修改或者是增加的时候是不会去修改共有属性的/原型的.默认情况
- 也可以强行修改,但不推荐 obj.proto.toStrign = 'xxx' 这样就共有属性的toString就被全部修改了
- 示意图 :
增删改查 对象属性
删
- obj.name =undefined 这样只是把name的value值变成了 undefined,保留了键key.其实就是一种赋值只不过是赋值了空
- delete.obj.name 是把整个键值对全部删除.
delete.obj['name']
也可以- 怎么知道有没有删除成功? in
- 'name' in obj
- 含有属性名,但是有值为 undefined
- 'xxx' in obj && obj.xxx === undefined
查
- object.keys() 查看所有键
- object.values() 查看所有的值
- object.entries() 把所有键分成一个数组,把所有值分成一个数组.
- console.dir() 以目录的形式打印出来
- object.hasOwnProperty('属性') 区分是隐藏属性,还是自生的属性
- obj['key'] / obj.key 查看单个属性 key 指的是属性名
- 事例题: 使用那种方式可以吧 person中的属性打印出来
let list =['name','age','gender'];
let person ={name:'frank',age:18,gender:'man'};
for(let i =0;i<list .length;i++){
let name=list[i];
// console.log(person);
}
//person 的所有属性打印出来 怎么写
// 1. person.name 2.person[name]
- 答案: 因为 用person.name 你只会重复打印三次 使用.运算法 name就是字符串, person[name] 被中括号[]里面的值就是变量 上文有提到过,所以每次循环 后值改变了打印的属性就会不同.
修/增
//直接赋值
let obj = {name:'frank'} //name 是字符串
obj.name='frank' //name 是字符串
obj['name']='frank'
obj[name] ='frank' //错,因为name就成了变量不确定的了
boj['na'+'me'] = 'frank'
let key = 'name';
obj [key] = 'frank' //注意这里 上面key已经被赋值了 所以就不是变量了
//批量赋值
object.assign(obj,{age;18,gender:'man'})
Object.create 的使用
-
语法: Object.create(proto,[propertiesObject])
-
创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
其实就是提供一个类似公共对象方法,
-
指定我可继承谁,上图 person和person2 的父级就是common,里面的属性,两个儿子都能用了.隐藏对象就像爷爷. 简单的理解我觉得应该是这样
-
其实还有原型链,中间还可以加.用厂家 总代理 二级代理 客户 更加贴切点吧.只要用create 相当于我就可以添加一个代理 是一代理 二级代理 或者三级代理 看你放着位置. 总代理就是我们普通情况下的隐藏属性. 不管你create怎么增加 我总代理是亲儿子就是你的上一级.厂家就是那个null;
一线大厂高级前端编写,前端初中阶面试题,帮助初学者应聘,需要联系微信:javadudu