PrivateProperty

Weakly references a value to a specified object. May be used to create private fields.

目前为 2019-10-27 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/391608/744505/PrivateProperty.js

// ==UserScript==
// @name         PrivateProperty
// @namespace    hoehleg.userscripts.private
// @version      0.1
// @description  Weakly references a value to a specified object. May be used to create private fields.
// @author       Gerrit Höhle
// @grant        none
// ==/UserScript==

/* jshint esversion: 6 */
 class PrivateProperty {

    constructor(initialValue) {
        this._weakReferences = new WeakMap();
        this._initialValue = initialValue;
    }

    init(object, initialValueSpecific = this._initialValue) {
        const value = (typeof initialValueSpecific === "function") ? initialValueSpecific() : initialValueSpecific;
        this._weakReferences.delete(object);
        this._weakReferences.set(object, { 
            initialValue: initialValueSpecific,
            value: value 
        });
        return this;
    }

    has(object) {
        return this._weakReferences.has(object);
    }

    get(object) {
        const data = this._weakReferences.get(object);
        if (data) {
            return data.value;
        }
    }

    set(object, value) {
        const data = this._weakReferences.get(object) || { 
            initialValue: this._initialValue 
        };
        data.value = value;
        privateProperty._weakReferences.set(keyObj, data);
    }

    getInitialValue(object) {
        const data = this._weakReferences.get(object);
        return data ? data.initialValue : this._initialValue;
    }

    getOrCompute(object, fnc) {
        let data = this._weakReferences.get(object);
        if (!data) {
            data = { 
                initialValue: this._initialValue,
                value: fnc()
            };
            this._weakReferences.set(object, data);
        }
        return data.value;
    }

    for(object) {
        return {
            init: PrivateProperty.prototype.init.bind(this, object),
            has: PrivateProperty.prototype.has.bind(this, object),
            get: PrivateProperty.prototype.get.bind(this, object),
            set: PrivateProperty.prototype.set.bind(this, object),
            getInitialValue: PrivateProperty.prototype.getInitialValue.bind(this, object),
            getOrCompute: PrivateProperty.prototype.getOrCompute.bind(this, object),
            valueOf: PrivateProperty.prototype.get.bind(this, object),
            toString: () => (String(PrivateProperty.prototype.get.bind(this, object)))
        };
    }
}