Greasy Fork is available in English.
Weakly references a value to a specified object. May be used to create private fields.
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/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)))
};
}
}