您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Weakly references a value to a specified object. May be used to create private fields.
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/391608/744693/PrivateProperty.js
- // ==UserScript==
- // @name PrivateProperty
- // @namespace hoehleg.userscripts.private
- // @version 0.2
- // @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 = (() => {
- let prototypeFunctions;
- 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;
- this._weakReferences.set(object, 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) {
- const bound = prototypeFunctions.map(([propName, fnc]) => ({ [propName]: fnc.bind(this, object) }));
- return Object.assign({}, ...bound);
- }
- }
- prototypeFunctions = Object.getOwnPropertyNames(PrivateProperty.prototype)
- .filter(propName => typeof PrivateProperty.prototype[propName] === "function")
- .filter(propName => propName !== "constructor")
- .filter(propName => propName !== "for")
- .map(propName => ([ [propName], PrivateProperty.prototype[propName] ]));
- return PrivateProperty;
- })();