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();
 
  • 图解

js 对象

原型

  • 每个对象都有原型
    • 原型里面存着对象的原型
    • 比如 obj 的原型就是一个对象
    • obj.__proto__存着这个对象的地址
    • 这个对象里面有 toString/constructor/valueof等属性
  • 对象的原型也是对象
    • 所以对象的原型也是原型
    • obj ={}的原型即为所有对象的原型
    • 这个原型包含所有对象的共有属性,是对象的根
    • 根这个对象也是有原型的,是null
  • 查看/读的时候会去 原型/共有属性中去查看,
  • 但修改或者是增加的时候是不会去修改共有属性的/原型的.默认情况
    • 也可以强行修改,但不推荐 obj.proto.toStrign = 'xxx' 这样就共有属性的toString就被全部修改了
  • 示意图 :

js 对象

js 对象

增删改查 对象属性

  • obj.name =undefined 这样只是把name的value值变成了 undefined,保留了键key.其实就是一种赋值只不过是赋值了空
  • delete.obj.name 是把整个键值对全部删除.
  • delete.obj['name'] 也可以
  • 怎么知道有没有删除成功? in
    • 'name' in obj
  • 含有属性名,但是有值为 undefined
  • 'xxx' in obj && obj.xxx === undefined

js 对象

  • 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] 被中括号[]里面的值就是变量 上文有提到过,所以每次循环 后值改变了打印的属性就会不同.

js 对象

修/增

//直接赋值
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'})
 

js 对象

Object.create 的使用

  • 语法: Object.create(proto,[propertiesObject])

  • 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

其实就是提供一个类似公共对象方法,

js 对象

  • 指定我可继承谁,上图 person和person2 的父级就是common,里面的属性,两个儿子都能用了.隐藏对象就像爷爷. 简单的理解我觉得应该是这样

  • 其实还有原型链,中间还可以加.用厂家 总代理 二级代理 客户 更加贴切点吧.只要用create 相当于我就可以添加一个代理 是一代理 二级代理 或者三级代理 看你放着位置. 总代理就是我们普通情况下的隐藏属性. 不管你create怎么增加 我总代理是亲儿子就是你的上一级.厂家就是那个null;

回复

我来回复
  • 暂无回复内容