面向对象(oop)的一些基础知识(二)之检测属性是否为当前对象的成员

Fn和Fn()的区别

当new 执行的时候,如果不传递实参,那么可以写成new Fn,也就是不加小括号,这被称为无参数列表。相反的,如果是new Fn()被称为带参数列表。
两者在优先级上也有区别

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
在这里插入图片描述
同时再强调一下,每一次new都是把函数重新执行,重新形成一个新的上下文,重新创造一个新的实例对象,代码重新执行。

检测属性是否为当前对象的成员

1.首先辨析两个概念:变量和属性。变量在stack里面的or当前上下文中。而属性是堆内存(heap)的成员。变量和属性完全没有共同点。
2.现在上前菜:检测一个属性是否为当前对象的成员
①key in obj:不论公有还是私有,只要有就是true
②obj.hasOwnProperty:必须是对象的私有属性,结果才是true;
3.正餐:自己拓展的检测对象的私有属性的

function hasPubProperty(attr, obj) {
    //思路1:一个属性key,如果是obj的属性,但是不是公有的,那就是私有的。
    //bug:如果一个属性既是私有的,又是公有的,那检测出来的结果就是不准的。
    return (attr in obj) && (!obj.hasOwnProperty)
}
function hasPubProperty(attr, obj) {
    //思路2:检测对象的原型上的属性,因为原型上的属性都是公共的
    let proto = Object.getPrototypeOf(obj)
    while (proto) {
        if (proto.hasOwnProperty(attr)) {
            return ture
        }
        proto = Object.getPrototypeOfObject.getPrototypeOf(proto)
            //依次查找原型链,直到找到object.prototype为止。
    }
}

遍历对象获取symbol属性

1.Object.keys(obj)获取当前对象obj的所有非symbol的私有属性[数组]
2. Object.getOwnPropertyNames(obj)返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
3. Object.getOwnPropertySymbols(obj):获取对象所有的symbol私有属性[数组]。
4. for…in循环遍历对象
①优先遍历数字属性,此时‘12’和12没有区别,同时数字属性按照从小到大的顺序排列。
②不会遍历symbol属性
③会遍历到自己拓展到类原型上的公共属性方法(可枚举的),内置的公共属性是不可枚举的,也就是不可遍历的。

Object.prototype.AA = 'WORKHARD'
let obj = {
    name: 'doug',
    age: 23,
    0: 100,
    [Symbol('AA')]: 200,
    [Symbol.toPrimitive]: function() {
        return 0;
    }
}
for (let key in obj) {
    if (!obj.hasOwnProperty(key));
    break
    console.log(key)
}
let keys = [
    ...Object.keys(obj),
    ...Object.getOwnPropertySymbols(obj)
]
keys.forEach(key => {
    console.log(`属性名:${String(key)},属性值:${obj[key]}`);
})
 /*属性名:0,属性值:100
    VM12:21 属性名:name,属性值:doug
    VM12:21 属性名:age,属性值:23
    VM12:21 属性名:Symbol(AA),属性值:200
    VM12:21 属性名:Symbol(Symbol.toPrimitive),属性值:function() {
            return 0;
        } */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值