javascript面向对象精要学习总结(第三章 对象)

属性添加原理
  • 一个对象首次添加某一属性时,是调用对象内部的put方法
  • 一个对象修改某一属性是,是调用对象内部的set方法
属性是否存在
  • 使用 in 方法时,会检测【自有属性】+【原型属性】
  • 使用 hasOwnProperty 仅会检测【自有属性】
  • 使用 if 语句检测是不准备的,因为无法过滤假值
var obj = {
  name:"zk",
  age :19,
  id:0
}
console.log( "name" in obj);//true
console.log(obj.hasOwnProperty("name"));//true
console.log(Boolean(obj.id));//false
删除对象属性用 delete
  • 仅能删除自有属性,不能删除原型属性
属性遍历
  • 新添加的属性默认是【可枚举的】
  • for in 循环会遍历【自有属性】+【原型属性】
  • in 循环会遍历【自有属性】+【原型属性】
  • Object.keys() 循环仅会遍历【自有属性】
对象属性类型
  • 数据属性。包含一个值
  • 访问器属性。包含数据属性的值,还有读写(get、set)时调用的函数
  • 当你希望【读取】或【赋值】操作会触发一些行业时,才会使用sgetter和setter方法

例子

  • 注意!_name属性不可改为name,否则会造成内存益出!
  • 注意!get name方法其实已经为person声明了一个name属性了
var person = {
  age:19,
  _name:"gs",
  get name(){
    console.log("reading");
    return this._name
  },
  set name(val){
    console.log("setting name is ",val);
    this._name = val;
  }
}
//注意,上边的_name属性不可改为name,否则会造成内存益处!!!
//注意,这里,已经生成了name属性,同时有_name和name两个属性
console.log(person);//{ "age": 19, "_name": "gs", "name": "gs" }
person.name = "zk";
console.log(person);
属性特征

访问器属性

  • enumerable | configurable | get | set

数据属性

  • enumerable | configurable | value | writable

enumerable 是否可遍历

  • for in 查找不到该属性。但是 in 方法可以判断

configurable 是否可配置

  • 设为false时,不可用 delete 删除
  • 设为false时,将无法再更改为可配置

value 属性的值

writable 是否可写入

Object.defineProperty 定义属性
Object.defineProperties 同时定义多属性

  • 定义新属性时,必须要赋值,否则布尔型的特征会默认为 false
  • 有3个参数,对象 | 属性名 | 特征参数对象
var person = {
  age:19,
  _name:"gs",
  get name(){
    console.log("reading");
    return this._name
  },
  set name(val){
    console.log("setting name is ",val);
    this._name = val;
  }
}
//注意,上边的_name属性不可改为name,否则会造成内存益处!!!
//注意,这里,已经生成了name属性,同时有_name和name两个属性
console.log(person);//{ "age": 19, "_name": "gs", "name": "gs" }
person.name = "zk";
console.log(person);

for(key in person){
  console.log(key);
}
Object.defineProperty(person,"name",{
  enumerable:false
})
Object.defineProperty(person,"age",{
  configurable:false
})
for(key in person){
  console.log(key);
}
delete person.age;
console.log(person.age);

Object.getOwnPropertyDescriptor 获取属性特性

  • 两个参数,1 为对象,2 为对象属性

Object.getOwnPropertyNames 获取属性名称

  • 参数为对象。返回值为所有属性名的数组

Object.getOwnPropertySymbols es6

Object.preventExtensions 使对象不可扩展
Object.isExtensible 判断是否可扩展

  • 参数均为对象

Object.seal 封印对象
Object.isSealed 判断对象是否被封印

  • 被封印对象是不可扩展的,且所有属性都不可配置

Object.freeze 冻结对象
Object.isfrozen 判断对象是否被冻结

  • 是一个封印对象 + 数据属性都为只读的对象
  • 被冻结对象无法解冻
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值