关于 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