全局函数

该页面列举的函数都是全局函数,不用 require 可以直接使用。

Promise

ThinkJS 中的 Promise 使用了 es6-promise 库,是个全局对象, 含有如下的方法:

  • all(array)
  • resolve(promise | thenable | obj)
  • reject(obj)
  • race(array)

Class(superCls, prop)

  • superCls function 父类
  • prop function | object 如果是 function,则执行这个 function,并获取结果
  • return function

通过该函数动态创建一个类,可以实现类继承和自动调用 init 方法的功能,同时实例化类的时候可以省去 new。如果只传了一个参数,则认为是 prop。

  1. //A 为通过 Class 动态创建的一个类
  2. var A = Class(function(){
  3. return {
  4. init: function(name){
  5. this.name = name;
  6. },
  7. getName: function(){
  8. return "A" + this.name;
  9. }
  10. }
  11. });
  12. // 实例化类 A,可以不写 new
  13. var instance = A("welefen");
  14. var name = instance.getName(); /*name is `A welefen`*/

通过 Class 函数创建的类支持继承,含有以下 2 个静态方法:

  • extend(obj) 扩展方法到类的原型上
  • inherits(superCls) 指定该类的父类

子类可以继承父类的方法,同时可以对方法进行重写。

  1. var B = Class(A, {}); //B 类从 A 类继承而来
  2. //B 类的实例化
  3. var instance = B("welefen");
  4. var name = instance.getName(); /*name is `A welefen`*/
  5. B.extend({
  6. getName: function(){ //B 类对 getName 方法进行了重写
  7. return "B" + this.name;
  8. }
  9. });
  10. var name = instance.getName(); /*name is `B welefen`*/

也可以在重写的方法里调用父类的方法,如:

  1. var C = Class(A, {
  2. getName: function(){
  3. var name = this.super("getName");
  4. return "C" + name;
  5. }
  6. }); // 从 A 类继承
  7. var instance = C("welefen");
  8. var name = instance.getName(); /*name is `C A welefen`*/

如果有多级继承,想跨级调用父类的方法时,只能通过 apply 的方式调用原形链上的方法,如:

  1. var D = Class(C, {
  2. getName: function(){
  3. var name = A.prototype.getName.apply(this, arguments);
  4. return 'D' + name;
  5. }
  6. }); // 从 C 类继承
  7. var instance = D('welefen');
  8. var name = instnace.getName(); /*name is `D A welefen`*/;

注意: 不可用下面的方式来继承

  1. var A = Class();
  2. var B = Class({
  3. getName: function(){}
  4. }).inherits(A); // 此时 B 不含有 getName 方法

extend(target, source1, source2, …)

  • target object
  • source1 object
  • return object

将 source1, source2 等对象上的属性或方法复制到 target 对象上,类似于 jQuery 里的 $.extend 方法。

默认为深度复制,可以将第一个参数传 false 进行浅度复制。

注意: 赋值时,忽略值为 undefined 的属性。

isBoolean(obj)

  • obj 要检测的对象
  • return true OR false

检测一个对象是否是布尔值。

  1. // 判断是否是布尔值
  2. isBoolean(true); //true
  3. isBoolean(false); //true

isNumber(obj)

检测一个对象是否是数字。

  1. isNumber(1); //true
  2. isNumber(1.21); //true

isObject(obj)

检测是否是对象

  1. isObject({}); //true
  2. isObject({name: "welefen"}); //true

isString(obj)

检测是否是字符串

  1. isString("xxx"); // true
  2. isString(new String("xxx")); //true

isFunction(obj)

检测是否是函数

  1. isFunction(function(){}); //true
  2. isFunction(new Function("")); //true

isDate(obj)

检测是否是日期对象

  1. isDate(new Date()); //true

isRegexp(obj)

检测是否是正则

  1. isRegexp(/\w+/); //true
  2. isRegexp(new RegExp("/\\w+/")); //true

isError(obj)

检测是否是个错误

  1. isError(new Error("xxx")); //true

isEmpty(obj)

检测是否为空

  1. // 检测是否为空
  2. isEmpty({}); //true
  3. isEmpty([]); //true
  4. isEmpty(""); //true
  5. isEmpty(0); //true
  6. isEmpty(null); //true
  7. isEmpty(undefined); //true
  8. isEmpty(false); //true

isArray(obj)

检测是否是数组

  1. isArray([]); //true
  2. isArray([1, 2]); //true
  3. isArray(new Array(10)); //true

isIP4(obj)

检测是否是 IP4

  1. isIP4("10.0.0.1"); //true
  2. isIP4("192.168.1.1"); //true

isIP6(obj)

检测是否是 IP6

  1. isIP6("2031:0000:130f:0000:0000:09c0:876a:130b"); //true
  2. isIP6("2031:0000:130f::09c0:876a:130b"); //true

isIP(obj)

检测是否是 IP

  1. isIP("10.0.0.1"); //true
  2. isIP("192.168.1.1"); //true
  3. isIP("2031:0000:130f:0000:0000:09c0:876a:130b"); //true ip6

isFile(file)

检测是否是文件,如果在不存在则返回 false

  1. isFile("/home/welefen/a.txt"); //true
  2. isFile("/home/welefen/dirname"); //false

isDir(dir)

检测是否是目录,如果不存在则返回 false

  1. isDir("/home/welefen/dirname"); //true

isBuffer(buffer)

检测是否是 Buffer

  1. isBuffer(new Buffer(20)); //true

isNumberString(obj)

是否是字符串类型的数字

  1. isNumberString(1); //true
  2. isNumberString("1"); //true
  3. isNumberString("1.23"); //true

isPromise(promise)

检测是否是个 promise

  1. isPromise(new Promise(function(){})); //true
  2. isPromise(getPromise()); //true

isWritable(p)

判断文件或者目录是否可写,如果不存在则返回 false

mkdir(p, mode)

递归的创建目录

  • p 要创建的目录
  • mode 权限,默认为 0777
  1. // 假设 /home/welefen/a/b/ 不存在
  2. mkdir("/home/welefen/a/b");
  3. mkdir("home/welefne/a/b/c/d/e"); // 递归创建子目录

chmod(p, mode)

修改目录权限,如果目录不存在则直接返回

  1. chmod("/home/welefen/a", 0777);

ucfirst(name)

将首字符变成大写,其他变成小写

  1. ucfirst("welefen"); // Welefen
  2. ucfirst("WELEFEN"); // Welefen

md5(str)

获取字符串的 md5 值,如果传入的参数不是字符串,则自动转为字符串

  1. md5("welefen"); //59dff65d54a8fa28fe372b75d459e13b

getPromise(obj, reject)

获取一个 promise 对象。默认为 resolve promise,如果 reject 参数为 true,那么返回 reject promise

如果 obj 是 promise,那么直接返回。

  1. getPromise([]); //resolve promise
  2. getPromise(new Error(""), true); //reject promise
  3. var promise = getPromise("");
  4. getPromise(promise); //

getDefer()

获取一个 Deferred 对象,对象含有如下的属性或者方法:

  • resolve 方法:将 promise resolve
  • reject 方法:将 promise reject
  • promise 属性:Deferred 对应的 Promise
  1. // 把读取文件内容变成 promise
  2. var fs = require("fs");
  3. function getFileContent(file){var deferred = getDefer();
  4. fs.readFile(file, "utf8", function(err, content){
  5. // 如果有错误,那么 reject
  6. if(err){deferred.reject(err);
  7. }else{
  8. // 成功读取到内容
  9. deferred.resolve(content);
  10. }
  11. })
  12. return deferred.promise;
  13. };
  14. getFileContent("/home/welefen/a.txt").then(function(content){//}).catch(function(err){console.log(err.stack);
  15. })

deferred.promise 默认为 pedding 状态,pedding 状态的 promise 不会执行后续的 then,也不会执行 catch。如果想阻止后面的代码继续执行,那么可以返回一个 pedding promise

  1. // 返回一个 pedding promise
  2. var getPeddingPromise = function(){var deferred = getDefer();
  3. return deferred.promise;
  4. }
  5. getPeddingPromise().then(function(){// 这里的代码不会执行}).catch(function(){// 这里的代码也不会执行})

getObject(name, value)

在项目中,经常会遇到要动态创建一个对象。如:

  1. var data = {};
  2. //name 和 value 从其他地方动态读取出来的
  3. data[name] = value;
  4. // 有时候还要设置多个
  5. data[name1] = value1;

为了方便创建对象,可以通过 getObject 来完成。

  1. // 单个属性
  2. var data = getObject(name, value);
  3. // 多个属性
  4. var data = getObject([name, name1], [value, valu1]);
  5. // 更多的属性
  6. var data = getObject([name, name1, name2, name3], [value, value1, value2, value3]);

arrToObj(arr, key, valueKey)

在项目中,经常会从数据库中查询多条数据,然后对数据进行一些操作。如:根据特定的 key 进行去除等。我们一般借助对象来完成此类操作,这时候需要把数组转化为对象。

可以借助 arrToObj 来完成。

  1. // 从数据库中查询出来的数据对象
  2. var arr = [{id: 10, name: "name1", value: "value1"}, {id: 11, name: "name2", value: "value2"}];
  3. // 把 id 值作为 key 生成一个对象
  4. /* data = {10: {id: 10, name: "name1", value: "value1"}, 11: {id: 11, name: "name2", value: "value2"}} */
  5. var data = arrToObj(arr, "id");
  6. // 把 id 值作为 key,只需要 name 的值
  7. //data = {10: "name1", 11: "name2"}
  8. var data = arrToObj(arr, "id", "name");
  9. // 只获取 id 的值
  10. // ids = [10, 11];
  11. var ids = arrToObj(arr, "id", null);