JS 中构造函数及对象属性一些问题

本文探讨了JavaScript中的构造函数执行过程,包括如何初始化this和返回实例对象。同时,介绍了检测对象属性的方法,如使用'in'操作符和hasOwnProperty()。还讨论了for in循环的特性,如遍历数字属性、排除symbol属性以及包含扩展的公共属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数

  • 函数执行的时候基于 new 执行
    1. 构造函数执行,最开始会和普通函数一样,形成私有上下文
    2. 创建上下文后,浏览器会再创建一个实例对象
    3. 初始化 this 的时候,让 this 指向当前实例对象
    4. 在代码执行完成后,返回时:
      • 若不返回,则默认返回实例对象
      • 若返回基本数据类型值或不返回,浏览器会把实例对象返回
      • 若返回引用数据类型值,则返回该引用类型值
function fn(x, y) {
    let total = x + y;
    this.x = x;
    this.y = y;
    return total;
}
let f1 = fn(10, 20);
console.log(f1); // => 30
let f2 = new fn(10, 20);
console.log(f2); // {x:10, y:20}

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

  • 属性名 in 对象 => 公有属性和私有属性都返回 true
  • 对象.hasOwnProperty => 只有私有属性,才返回 true
function fn(x, y) {
    let total = x + y;
    this.x = x;
    this.y = y;
    return total;
}
let f1 = new fn(10, 20);
// toString 为对象的公共属性
console.log('x' in f1);// true
console.log('toString' in f1);// true
console.log('total' in f1);// false

console.log(f1.hasOwnProperty('x')); // true
console.log(f1.hasOwnProperty('toString'));// false
console.log(f1.hasOwnProperty('total'));// false

假设我们现在需要检测一个对象的属性是否为公共属性,利用以上两个语法糖就很方便

function fn(x, y) {
    let total = x + y;
    this.x = x;
    this.y = y;
    return total;
}
let f1 = new fn(10, 20);

console.log(hasPubProperty(f1, 'x'));
console.log(hasPubProperty(f1, 'toString'));
console.log(hasPubProperty(f1, 'total'));

function hasPubProperty(obj, name) {
    return name in obj && !obj.hasOwnProperty(name);
}

for in 的一些问题

  • 基于 for in 循环遍历对象
    • 优先遍历数字属性
    • 不会遍历 symbol 属性
    • 会把自己扩展的公共属性也遍历到
Object.prototype.AAA = 'AAA';
let obj = {
    name: 'patrick',
    age: 22,
    0: 100,
    [Symbol('AA')]: 200,
    [Symbol.toPrimitive]: function () {
        return 0;
    }
};
for (key in obj) {
    console.log(key);
}
// 0 name age AAA
// AAA 是公共属性,也被遍历到
for (key in obj) {
    // 若不是私有属性 break
    if (!obj.hasOwnProperty(key)) break;
    console.log(key);
}
// 0 name age

// 但我们还没有获取到 symbol 的属性
// => Object.getOwnPropertySymbols(obj) 可以获取对象所有私有 symbol 属性

let keys = [
    ...Object.keys(obj),
    ...Object.getOwnPropertySymbols(obj)
];
console.log(keys); // => ['0', 'name', 'age', Symbol(AA), Symbol(Symbol.toPrimitive)]

keys.forEach(item => {
    console.log(`属性名为${String(item)}, 属性值为${obj[item]}`)
})
// 可以依次获取到 obj 的私有属性
// symbol 没法隐式转换为 string,所以把所有属性名手动转为字符串即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值