Javascript,对象原型 - 避免编写完整路径

时间:2016-11-05 17:59:08

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

我知道我的头衔可能不太清楚,我会尽力解释我想要实现的目标。

我知道修改原型通常是不受欢迎的,并且有充分的理由,所以我试图想办法这样做而不向原型添加任何多个项目。

我知道我可以简单地按照

的方式做点什么
Object.prototype.collection = {};
Object.prototype.collection.method1 = function(){ . . . };
Object.prototype.collection.method2 = function(){ . . . };
Object.prototype.collection.method3 = function(){ . . . };
etc.

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

objectInstance.collection.method1();

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

所以我希望能够以这种方式创建方法,而不必每次都写出完整的路径。即我可以写

objectInstance.method1();

它会知道在哪里看。

此时我的思考过程显然是调用后者会引发method does not exist错误。但我很好奇是否有任何方式拦截这个错误?

例如,在PHP中有spl_autoload_register()函数,只要未定义类就会调用它,允许您执行加载/定义它所需的任何操作。这种情况有没有相应的策略?

也许我可以添加辅助'后备'方法,如下所示:

Object.prototype.fallback = function( undefinedMethod ){

    if(this.collection.undefinedMethod){

        this.collection.undefinedMethod();

    }
};

每次调用一个方法时都会调用此方法,并传入方法。

任何有关这些方面的帮助,或者如果可能的话,都会非常感激。

2 个答案:

答案 0 :(得分:1)

不要做那样奇怪的事情。如果你想做好的方法,不要污染你不拥有的对象。只需创建自己的构造函数。

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

然后您的方法将可用于MyClass个实例。

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

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

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

答案 1 :(得分: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