JavaScript Symbol 的一些封装

方文锋  2023-07-06 10:06:19  726  首页学习JavaScript

JavaScript Symbol 的一些封装,方便操作。

相关代码如下:

 /**
 * 判断是否是数组
 * @param argument
 * @param {number|boolean} opt 是否用严格模式
 * @return {*}
 */
function is_array(argument, opt) {
    if (opt === 1 || opt === true) {
        return Object.prototype.toString.call(argument) === "[object Array]";
    }
    return argument && (typeof argument === "object") && ("length" in argument) && (typeof argument.length === "number");
}

/**
 * 判断是否是对象
 * @param argument
 * @return {*}
 */
function is_object(argument) {
    if (argument && (typeof argument === "object") && ("length" in argument)) {
        return Object.prototype.toString.call(argument) === "[object Object]";
    }
    return argument && (typeof argument === "object") && !("length" in argument);
}

/**
 * 判断是否是函数
 * @param argument
 * @return {*|boolean}
 */
function is_function(argument) {
    return typeof argument === "function";
}

/**
 * 判断是否是字符串
 * @param argument
 * @return {*|boolean}
 */
function is_string(argument) {
    return typeof argument === "string";
}

/**
 * 判断是否是数字
 * @param argument
 * @return {boolean}
 */
function is_number(argument) {
    return typeof argument === "number";
}

/**
 * 是否存在[true存在,false不存在]
 * @param argument
 * @param {array} opt 这里面的值是代表“不存在”
 * @return {boolean}
 */
function is_exist(argument, opt) {
    opt || (opt = ["", null, false, undefined]);
    for (var k in opt) {
        if (opt[k] === argument) {
            return false;
        }
    }
    return true;
}

/**
 * 判断是否是整数
 * @param vars
 * @return {boolean}
 */
function is_int(vars) {
    return /^[-]{0,1}\d+$/i.test(vars + "");
}

/**
 * 判断是否是小数
 * @param vars
 * @return {boolean}
 */
function is_float(vars) {
    return /^[-]{0,1}[0-9]+\.{0,1}[0-9]*$/i.test(vars + "")
}

/**
 * 是否是 symbol 类型
 * @param argument
 * @return {boolean}
 */
function is_symbol(argument) {
    return typeof argument === "symbol";
}

/**
 * 搜索数组中是否存在指定的值
 * @param {string} needle
 * @param {array} haystack
 * @param {boolean} argStrict
 * @return {boolean}
 */
function in_array(needle, haystack, argStrict) {
    var key = "", strict = !!argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true
            }
        }
    }
    return false
}

/**
 * 设置对象属性不可修改,不可删除,不可枚举等
 * @param {Object|Array|function|Storage} obj
 * @param {array|object|string} attrList
 */
function attrNotEach(obj, attrList) {
    var O = {writable: false, configurable: false, enumerable: false}; //设置对象属性不可修改,不可删除,不可枚举
    var list = ["[object Function]", "[object Storage]", "[object Window]"], val;
    if (is_object(obj) || is_array(obj) || in_array(Object.prototype.toString.call(obj), list, true)) {
        if (is_array(attrList)) {
            for (var i = 0, len = attrList.length; i < len; i++) {
                val = attrList[i];
                is_string(val) && Object.defineProperty(obj, val, O);
            }
        } else if (is_object(attrList)) {
            for (var attr in attrList) {
                val = attrList[attr];
                is_string(val) && Object.defineProperty(obj, val, O);
                is_object(val) && Object.defineProperty(obj, attr, Object.assign({}, O, val));
            }
        } else {
            is_string(attrList) && Object.defineProperty(obj, attrList, O);
        }
    }
}


/**
 * Symbol 相关封装
 * @constructor
 */
function Sym() {
    for (var i = 0, len = arguments.length; i < len; i++) {
        is_function(arguments[i]) && arguments[i].call(this);
    }
    this.__temp__ = {local: {}, global: {}};
    this.lGET = function (key) {
        return this.localGet(key);
    };
    this.gGET = function (key) {
        return this.globalGet(key);
    };
    this.lSET = function (key, value) {
        return this.localSet(key, value);
    };
    this.gSET = function (key, value) {
        return this.globalSet(key, value);
    };
}

Sym.prototype = {
    /**
     * 设置Symbol值
     * @param {Array|Object|String} key
     * @param {Symbol|String|*} value
     * @param {boolean} is_global
     * @return {Sym}
     */
    set: function (key, value, is_global) {
        var k, v, g = this.__temp__.global, lo = this.__temp__.local;
        if (is_array(key) || is_object(key)) {
            for (k in key) {
                this.set(k, key[k], is_global);
            }
        } else {
            if (!is_symbol(key) && this.is_string(key)) {
                if (is_symbol(value)) {
                    this.is_global(value) ? g[key] = value : lo[key] = value;
                } else if (this.is_string(value)) {
                    is_global ? g[value] = Symbol.for(value) : lo[value] = Symbol(value);
                } else {
                    is_global ? g[key] = Symbol.for(key) : lo[key] = Symbol(key);
                }
            }
        }
        return this;
    },
    /**
     * 获取 Symbol
     * @param {String|null} key
     * @param {boolean} is_global
     * @return {*}
     */
    get: function (key, is_global) {
        var g = this.__temp__.global, lo = this.__temp__.local;
        if (this.is_string(key)) {
            return is_global ? g[key] : lo[key];
        }
        return is_global ? g : lo;
    },
    localGet: function (key) {
        return this.get(key, false);
    },
    localSet: function (key, value) {
        return this.set(key, value, false);
    },
    globalGet: function (key) {
        return this.get(key, true);
    },
    globalSet: function (key, value) {
        return this.set(key, value, true);
    },
    is_string: function (arg) {
        return is_exist(arg) && (is_string(arg) || is_float(arg));
    },
    /**
     * 判断Symbol是否是全局的
     * @param {Symbol} arg
     * @return {boolean}
     */
    is_global:function (arg) {
        return is_symbol(arg) && !!Symbol.keyFor(arg);
    }
};

(function(){
    attrNotEach(Sym.prototype, ["get", "set", "localGet", "localSet", "globalGet", "globalSet", "is_string", "is_global"]);
}()); 
var sy = new Sym(); 


使用如图: