Greasy Fork is available in English.

PrivateProperty

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

Från och med 2019-10-27. Se den senaste versionen.

Detta skript bör inte installeras direkt. Det är ett bibliotek för andra skript att inkludera med meta-direktivet // @require https://update.greasyfork.org/scripts/391608/744459/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 */
const PrivateProperty = (() => {

    const getOrCreate = (privateProperty, keyObj, { initialValue = privateProperty._initialValue, value } = {}) => {
        let data = privateProperty._weakReferences.get(keyObj);
        if (!data) {
            data = { initialValue: initialValue, value: value };
            privateProperty._weakReferences.set(keyObj, data);
        }
        return data;
    };

    return 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 = getOrCreate(this, object);
            data.value = value;
        }

        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(data);
            }
            return data.value;
        }

        for(object) {
            return {
                init: PrivateProperty.prototype.init.bind(this, object),
                hasValue: PrivateProperty.prototype.hasValue.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)))
            };
        }
    };
})();