【问题标题】:How to create a Javascript function that inspects objects/ function based on property names that will survive minifcation?如何创建一个 Javascript 函数来检查基于属性名称的对象/函数,这些属性名称将在小型化中幸存下来?
【发布时间】:2014-09-12 01:04:15
【问题描述】:

假设我有一个这样的函数proxyThrough

function proxyThrough(parentClass, childObjPropertyName, methodName) {
    parentClass.prototype[methodName] = function() {
        this[childObjPropertyName][methodName].apply(this[childObjPropertyName], arguments);
    };
}

childPropertyNamemethodName 都是字符串,它通过名称查找函数。 我知道这将无法在缩小后继续存在。

我怎样才能让这样的函数在缩小后仍然存在?


示例

这就是我目前正在做的事情:

var BaseView = require('./BaseView');
var FooView = require('./FooView');

function BarView() {
    this._fooView = new FooView();
}

BarView.prototype = Object.create(BaseView.prototype);
BarView.prototype.constructor = BarView;

BarView.prototype.anAction = function() {
    this._barView.anAction.apply(this._barView, arguments);
};

BarView.prototype.anotherAction = function() {
    this._barView.anotherAction.apply(this._barView, arguments);
};

这就是我想要做的:

var BaseView = require('./BaseView');
var FooView = require('./FooView');

function BarView() {
    this._fooView = new FooView();
}

BarView.prototype = Object.create(BaseView.prototype);
BarView.prototype.constructor = BarView;

function proxyThrough(parentClass, childObjPropertyName, methodName) {
    parentClass.prototype[methodName] = function() {
        this[childObjPropertyName][methodName].apply(this[childObjPropertyName], arguments);
    };
}

['anAction', 'anotherAction'].forEach(proxyThrough.bind(null, BarView, '_fooView'));

【问题讨论】:

  • 变量/参数名称是否随着使用而不是名称而改变并不重要。仅当操作类似于 AngularJS's Dependency Injection scheme 时才需要避免混淆。
  • 当您需要将变量名称与字符串的值匹配时,缩小需要特殊的解决方法。变量名本身没有危险。
  • 在这个任务的另一个阅读中:使用一个可以控制的混淆器,这样被代理的方法/属性(以及这样的名称)不会改变。一旦它们被改变..它们被改变(在代码甚至运行之前)并且这些名称无法解析为原始名称,除非有一些保留的地图。
  • @PM77-1 和 user2864740 :我不太清楚你的意思。为了明确起见,我包含了一个 SSCCE 来说明我的用例。它看起来不会在缩小后幸存下来,因为我确实将字符串传递给 proxyThrough 函数。
  • 你确定它不会在缩小后存活吗?虽然函数参数经常更改 - 由于括号表示法的常见程度,对象字段通常不会被缩小器触及。

标签: javascript minify


【解决方案1】:

我想这取决于缩小器的工作方式,但如果它一致地重命名相同的属性名称,您可以使用辅助函数来获取缩小的属性名称:

function minifiedName(obj) {
    for (var prop in obj) {
        return prop;
    }
}

[
   minifiedName({anAction: null}),
   minifiedName({anotherAction: null})
].forEach(proxyThrough.bind(null, BarView, '_fooView'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多