你不知道的js—对象(2)

198 阅读1分钟

前先阅读上一篇

你不知道的js—对象(1) 书接上文

Getter和Setter

get和set设置时,和描述符一样。Vue2.0的响应时就是这样实现的

const obj = { a: 1 } 
Object.defineProperty('a', 
    { 
        get:function() {
            console.log('访问了a')
            return 10
        },
        set: function(val) {
            console.log('设置a为' + val)
        }
    }
)
console.log(obj.a); // 访问了a  // 10 
obj.a = 2; // 设置a为2
  • 访问a时,执行了get。访问到的值是get返回的值;
  • 给a赋值时,执行了set。set函数的参数是新的值;

存在性

如果想知道对象中是否存在某个属性,应该怎么做?

const obj = { a: 1 } 
console.log('a' in obj) // true
console.log('b' in obj) // false
console.log(obj.hasOwnProperty('a')) // true
console.log(obj.hasOwnProperty('b') // false

...in...和hasOwnProperty的区别是:

  • ...in...会遍历到原型链上的属性(必须时可枚举的)
  • hasOwnProperty只验证自身是否有该属性

枚举

  • ...in...会遍历到原型链上的属性(必须时可枚举的)
  • Object.keys(..)会返回一个数组,包含所有可枚举属性(自身的属性)
  • Object.getOwnPropertyNames(..)会返回一个数组,是否可枚举属性都会存在(自身的属性)
  • Object.getOwnPropertySymbols(..)会返回一个数组,获取Symbols类型的属性

遍历

数组的遍历很复杂,涉及到生成器Generator,以后单写一篇文章吧!