关于 JavaScript 构造函数的返回值

##使用new 运算符,构建新对象

1
2
3
function MyClass(){
this.some_prop = some_value
}

没有指定返回值,但是 var o = new MyClass() 后,o是指向返回的对象的,就是自动返回this

##显式return
在看express@4.9.4源码的时候,在 lib\router\index.js 中,

1
2
3
4
5
6
var proto = module.exports = function(options){
// ...
return function router(req, res, next) {
router.handle(req, res, next);
}
}

使用的时候是 new Router,不是直接调用Router , 在 application.js

那么问题来了

1
2
3
4
function MyClass(){
this.name = "zhangsan"
return true
}

new MyClass() 返回神马东西
? { name: “zhangsan” }
: true

为毛不是true ????

##return 规则

可以看看这两个链接
http://stackoverflow.com/questions/3350215/what-is-returned-from-a-constructor
http://www.gibdon.com/2008/08/javascript-constructor-return-value.html

If a constructor function returns nothing, null, or any atomic / non-object value then said value is ignored and the newly created object reference is given back to the caller. For example, a return value of 0 (zero) from a constructor function will be ignored.

就是说,显示返回的如果是

  • nothing(就是没写return 或者 return;)
  • obj = null,return null
  • 原子类型?/非object 值 , 这个原子类型可能说的是基本数据类型,像 Number/String/Boolean/Null/Undefined

返回这些值,在new调用的时候值会被忽略,而返回this值

关于返回function,算object值,返回不会被忽略

##实现单例模式

codewars 题目,实现单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
assert = require('assert');

var instance = new Singleton()

function Singleton () {
return instance
}

var o1 = new Singleton()
var o2 = new Singleton()

assert(o1 === o2)
assert(o1 === instance)
assert(o1 instanceof Singleton)

当instance是null/undefined 时,返回的是 this , 当instance有效时就返回instance