【问题标题】:Javascript, Object prototype - avoid writing full pathJavascript,对象原型 - 避免编写完整路径
【发布时间】:2017-03-19 09:30:59
【问题描述】:

我知道我的标题可能不是很清楚,我会尽力解释我想要实现的目标。

我知道修改原型通常是不受欢迎的,并且有充分的理由,所以我试图找出一种方法来做到这一点,而不会在原型中添加超过一个项目。

我知道我可以简单地按照

Object.prototype.collection = {};
Object.prototype.collection.method1 = function(){ . . . };
Object.prototype.collection.method2 = function(){ . . . };
Object.prototype.collection.method3 = function(){ . . . };
etc.

然后每当我想使用我可以调用的方法之一时

objectInstance.collection.method1();

这样做的问题在于,最终它会变得非常冗长乏味,更不用说如果你从这个集合中调用一百个方法,那么“集合”这个词一百次是多余的并且浪费字节。

所以我希望有一种以这种方式创建方法的技术,而不必每次都编写完整的路径。即我可以写

objectInstance.method1();

它会知道去哪里找。

此时我的想法是,显然调用后者会引发method does not exist 错误。但我很好奇是否有任何方法可以拦截这个错误?

例如,在 PHP 中有一个 spl_autoload_register() 函数,当一个类没有被定义时,它会被调用,允许你做任何必要的事情来加载/定义它。有没有针对这种情况的等效策略?

也许我可以添加一个辅助“后备”方法,如下所示:

Object.prototype.fallback = function( undefinedMethod ){

    if(this.collection.undefinedMethod){

        this.collection.undefinedMethod();

    }
};

每次未定义方法时都调用它,传入方法。

任何关于这些方面的帮助,或者如果可能的话,将不胜感激。

【问题讨论】:

  • 我将对此进行更多研究,但它看起来正是我所需要的!非常感谢!
  • 只要确保您的主机支持这一点,它就可以满足您的需求。让我知道这是否适合您,我可以将其发布为答案。
  • 我做了一些研究,是的,代理正是我需要做的事情!感谢上帝的 ES6!您是否知道任何用于支持 Internet Explorer 的 polyfills 或 hack?我会自己找一些,但我想我会先问。当然,如果您将此作为答案,那么我很乐意将其标记为已接受的答案。
  • 据我记忆,在 IE 下 polyfill 有一些问题。

标签: javascript methods prototype fallback spl-autoload-register


【解决方案1】:

一种可能的方法是使用新引入的Proxy,它允许您拦截对对象成员的任意调用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

来自 MDN 的示例

var handler = {
  get: function(target, name){
    return name in target?
        target[name] :
        37;
  }
};

var p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;

console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37

【讨论】:

    【解决方案2】:

    不要做那种奇怪的事情。如果您想以好的方式做到这一点,请不要污染您不拥有的对象。只需创建自己的构造函数。

    class MyClass {
      method1(){ . . . };
      method2(){ . . . };
      method3(){ . . . };
    }
    

    那么您的方法将可用于MyClass 实例。

    如果您想在所有Object 实例上使用您的方法,那么您需要污染Object.prototype。您要求解决方法,但它们基本上会遇到相同的问题。

    如果将方法定义为不可枚举,问题可能会更小,这样它们就不会出现在for-in 循环中。

    Object.prototype.method1 = function(){ . . . };
    Object.defineProperty(Object.prototype, 'method1', {enumerable:false});
    

    【讨论】:

    • 这只是我的意思,我不能那样做。为了长度,我没有在我的问题中包含这个,但这样做的目的是能够为我正在制作的一系列插件创建自定义后端/框架。而且我还想让框架可供其他人在其上构建。同样,为了篇幅,只要知道我有充分的理由不使用任何其他框架。我想避免类似 Jquery 的问题,即无法对未使用框架声明的变量使用自定义方法,这就是为什么我不会采用这条路线的原因。不过,我感谢您的洞察力和时间。
    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2011-01-07
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多