JS构造函数创建对象时的传参问题

本文探讨了在JavaScript中使用构造函数创建对象时遇到的问题,特别是当对象属性包含另一个对象时出现的错误。分析了构造函数的工作原理,包括全局作用域中的函数与构造函数的区别,以及`new`操作符在创建对象过程中的四个步骤。解决方案是在构造函数内部定义包含对象的属性,从而正确地传递和初始化复杂属性。

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

当对象属性为字符串时

function User(obj){
        this.name = obj.name;
        this.password = obj.password;
}
var user = new User({
    name:"name",
    password:"password"
});
window.onload = function(){
    console.log(user);
}

通过构造函数传参的方式新建对象,并可以正确输出对象

但是如果对象在属性值为一个对象

function User(obj){
    this.loginInfos.name = obj.loginInfos.name;
    this.loginInfos.password = obj.loginInfos.password;
}
var user = new User({
    loginInfos:{
        name:"name",
        password:"password"
    }
});
window.onload = function(){
    console.log(user);
}

会显示“Can not find property ‘name’ of undfined” ,就是找不到this.loginInfos这个属性,这是因为在构造函数User(obj)中,没有定义loginInfos这个属性,自然找不到loginInfos.name,那为什么前面直接定义this.name可以呢?

javascript在全局作用域中定义的函数,是定义在Global对象中的(即浏览器的window对象),在全局作用域中调用普通函数,this就指向Global对象(window对象),我们这里说构造函数,其实在没有使用new操作符时,User(boj)就是一个普通函数,所以当它在全局作用域中不通过new操作符调用时,this.name就是window.name;

function User(obj){
    this.name = obj.name;
    this.password = obj.password;
}
User({name:"name",password:"password"});
window.onload = function(){
    console.log(window.name);//name
    console.log(window.password);//password
}

而通过new操作符创建对象,会经历以下4个步骤:
1.创建一个新对象
2.将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3.执行构造函数中的代码(为这个新对象添加属性)
4.返回新对象
所以如果要通过构造函数传参创建一个属性值为对象的对象,可以在构造函数定义好属性值为对象的属性,可以如下

function User(obj){
    this.loginInfos = {};
    this.loginInfos.name = obj.loginInfos.name;
    this.loginInfos.password = obj.loginInfos.password;
}
var user = new User({
    loginInfos:{
        name:"name",
        password:"password"
    }
});

如此,就能解决对象的属性值为对象的传参问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值