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

  • Post author:
  • Post category:java






属性添加原理

  • 一个对象首次添加某一属性时,是调用对象内部的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 判断对象是否被冻结

  • 是一个封印对象 + 数据属性都为只读的对象
  • 被冻结对象无法解冻



版权声明:本文为qq_38310712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。