构造函数不需要显式 return,如果指定了返回值,则根据返回值的类型有不同的结果。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function PrimitiveUndefined() { }
function PrimitiveNull() { return null }
function PrimitiveBoolean() { return true }
function PrimitiveNumber() { return 123 }
function PrimitiveString() { return 'string' }
function PrimitiveSymbol() { return Symbol() }
function BooleanObject() { return new Boolean(true) }
function NumberObject() { return new Number(123) }
function StringObject() { return new String('string') }
function DateObject() { return new Date() }
function RegExpObject() { return /test/ }
function FunctionObject() { return function(){} }
function IteralObject() { return {} }
function IteralArray() { return [] }

const FUNCTIONS = [
    'PrimitiveUndefined',
    'PrimitiveNull',
    'PrimitiveBoolean',
    'PrimitiveNumber',
    'PrimitiveString',
    'PrimitiveSymbol',
    'BooleanObject',
    'NumberObject',
    'StringObject',
    'DateObject',
    'RegExpObject',
    'FunctionObject',
    'IteralObject',
    'IteralArray'
]

FUNCTIONS.forEach(func => {
    let obj = eval('new ' + func)
    let type = obj.constructor.name

    console.log('%c%s %c: %c%s',
        'color:#607ed8', func,
        'color:#888',
        'color:#d87860', type)
})

测试结果打印:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PrimitiveUndefined : PrimitiveUndefined
PrimitiveNull : PrimitiveNull
PrimitiveBoolean : PrimitiveBoolean
PrimitiveNumber : PrimitiveNumber
PrimitiveString : PrimitiveString
PrimitiveSymbol : PrimitiveSymbol
BooleanObject : Boolean
NumberObject : Number
StringObject : String
DateObject : Date
RegExpObject : RegExp
FunctionObject : Function
IteralObject : Object
IteralArray : Array

总结

  • 若手动 return 一个原始类型的值 (primitive value),则 return 语句不会起作用,仍然返回构造函数隐式创建的对象。
  • 若手动 return 一个对象类型的值,则会丢弃构造函数隐式创建的对象,返回 return 语句指定的对象。