JS中带返回值的构造函数

传统语言中,构造函数是没有返回值的。构造函数与普通函数的区别可以认为是:构造函数中没有return语句,普通函数可以return;构造函数中使用this定义成员变量和成员方法,普通函数中不使用this关键字定义成员变量和方法。然而在JavaScript中构造函数可以有返回值也可以没有。

1.没有返回值的情况像其他传统语言一样,返回实例化的对象:

function Person(){
    this.name="monster1935";
    this.age='24';
    this.sex="male";
}
console.log(Person());  //undefined
console.log(new Person());//Person {name: "monster1935", age: "24", sex: "male"}

2.如果存在返回值则检查其返回值是否为引用类型,如果为非引用类型,如(string,number,boolean,null,undefined),上述几种类型的情况与没有返回值的情况相同,实际返回实例化的对象:

function Person(){
    this.name="monster1935";
    this.age='24';
    this.sex="male";

    return "monster1935";
}
console.log(Person());  //monster1935
console.log(new Person());//Person {name: "monster1935", age: "24", sex: "male"}

3.如果存在返回值是引用类型,则实际返回该引用类型:

function Person(){
    this.name="monster1935";
    this.age='24';
    this.sex="male";

    return {
        name:'Object',
        age:'12',
        sex:'female'
    }
}
console.log(Person());  //Object {name: "Object", age: "12", sex: "female"}
console.log(new Person());//Object {name: "Object", age: "12", sex: "female"}

原文:http://blog.youkuaiyun.com/a1247529789/article/details/51645951

<think>我们正在讨论JavaScript构造函数返回值规则。根据提供的引用,我们可以总结如下: 1. 通常情况下,构造函数不需要显式返回值,因为默认会返回新创建的实例对象(即`this`指向的对象)。 2. 如果构造函数返回一个基本类型(如`string`, `number`, `boolean`, `null`, `undefined`),那么返回值将被忽略,仍然返回新创建的实例对象。 3. 如果构造函数返回一个对象(引用类型),那么这个返回的对象会取代原本应该返回的实例对象(即`this`指向的对象被丢弃),此时通过`new`操作符得到的就是这个返回的对象。 下面用代码示例来说明: ### 情况一:无返回值返回基本类型 ```javascript function Person(name) { this.name = name; // 无return语句,或者返回基本类型 // return 123; 或者 return "hello"; } const p = new Person('Alice'); console.log(p); // 输出: Person { name: 'Alice' } ``` ### 情况二:返回对象(引用类型) ```javascript function Person(name) { this.name = name; // 返回一个对象 return { age: 30 }; } const p = new Person('Alice'); console.log(p); // 输出: { age: 30 },而不是Person对象 ``` ### 情况三:返回函数(也是引用类型) ```javascript function Person(name) { this.name = name; // 返回一个函数 return function() { console.log('hello'); }; } const p = new Person('Alice'); console.log(p); // 输出: [Function],而不是Person对象 ``` ### 注意事项 - 如果构造函数返回的是`null`,虽然`null`是基本类型,但是注意`typeof null`是`'object'`(这是JavaScript的一个历史遗留问题)。然而,在构造函数返回`null`时,它被视为基本类型,所以仍然返回实例对象。例如: ```javascript function Person(name) { this.name = name; return null; } const p = new Person('Alice'); console.log(p); // 输出: Person { name: 'Alice' } ``` ### 总结规则 - 构造函数中,如果返回的是非对象(即基本类型),则忽略返回值返回新创建的实例对象。 - 如果返回的是对象(包括数组、函数等),则返回该对象,而不再返回新创建的实例对象。 这个行为是由JavaScript的`new`操作符的机制决定的。当使用`new`调用构造函数时,实际上会进行以下步骤: 1. 创建一个新的空对象,并将其原型指向构造函数的`prototype`属性。 2. 将这个新对象绑定到构造函数中的`this`,并执行构造函数。 3. 如果构造函数返回一个对象(非空对象,函数,数组等),则返回这个对象;否则返回步骤1创建的对象。 因此,在编写构造函数时,通常不应该返回一个对象(除非有特殊需求),以免造成混淆。 §§相关问题§§ 1. 在JavaScript中,使用`new`操作符调用构造函数时,内部具体执行了哪些步骤? 2. 如何防止在调用构造函数时忘记使用`new`关键字? 3. 除了返回值规则,构造函数和普通函数还有哪些区别?</think>### JavaScript 构造函数返回值规则详解 在 JavaScript 中,构造函数返回值的行为遵循特定规则,这些规则决定了`new`操作符最终返回的对象。核心规则如下: #### 1. **默认情况:返回实例对象** 当构造函数没有`return`语句或返回**基本类型**(`undefined`/`null`/`number`/`string`/`boolean`/`symbol`/`bigint`)时,会忽略返回值返回新创建的实例对象(即`this`指向的对象): ```javascript function Person(name) { this.name = name; // 无return或返回基本类型 // return 123; → 被忽略 } const p = new Person("Alice"); console.log(p); // Person { name: "Alice" } ✅ ``` #### 2. **返回引用类型:覆盖实例** 当构造函数返回**引用类型**(对象/数组/函数等)时,该返回值会**完全取代**原本应返回的实例对象: ```javascript function Animal() { this.type = "Dog"; return { type: "Cat" }; // 返回对象(引用类型) } const a = new Animal(); console.log(a); // { type: "Cat" } ✅(非Animal实例) ``` #### 3. **特殊边界情况** - **返回`null`**:被视为基本类型,仍返回实例对象: ```javascript function Car() { return null; // 基本类型(特殊) } const c = new Car(); console.log(c); // Car {} ✅ ``` - **返回函数**:函数是引用类型,会覆盖实例: ```javascript function Logger() { return () => console.log("Hi"); // 返回函数 } const log = new Logger(); log(); // "Hi" ✅(log是函数而非Logger实例) ``` ### 关键概念总结 | 返回值类型 | 结果 | 示例 | |------------------|--------------------------|--------------------| | 无返回值 | 返回`this`指向的实例 | `new Person()` | | 基本类型 | 忽略,返回实例 | `return 100;` | | 引用类型 | 覆盖实例,返回该对象 | `return {x:1};` | | `null` | 视为基本类型,返回实例 | `return null;` | ### 为什么这样设计? 这种设计允许构造函数实现**灵活的对象创建模式**: 1. **工厂模式**:返回不同子类的实例 2. **单例模式**:始终返回同一个对象 3. **缓存机制**:返回预先创建的实例 > 最佳实践:除非有特殊需求,构造函数中**避免使用`return`**,否则可能破坏`instanceof`的预期行为[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值