Javascript, Object prototype - 避免写完整路径
Javascript, Object prototype - avoid writing full path
我知道我的标题可能不是很清楚,我会尽力解释我想要实现的目标。
我知道修改原型通常是不受欢迎的,并且有充分的理由,所以我试图找出一种方法来做到这一点而不向原型添加任何超过一个项目。
我知道我可以简单地按照
的方式做一些事情
Object.prototype.collection = {};
Object.prototype.collection.method1 = function(){ . . . };
Object.prototype.collection.method2 = function(){ . . . };
Object.prototype.collection.method3 = function(){ . . . };
etc.
然后每当我想使用我可以调用的方法之一时
objectInstance.collection.method1();
这个问题最终会变得冗长乏味,更不用说如果你从这个 collection 调用一百个方法,'collection' 这个词一百次是冗余和浪费字节。
所以我希望有一种以这种方式创建方法的技术,而不必每次都写完整路径。即我可以写
objectInstance.method1();
它会知道去哪里找。
此时我的思考过程是,显然调用后者会引发 method does not exist
错误。但是我很好奇是否有任何方式可以拦截此错误?
例如,在 PHP 中有一个 spl_autoload_register() 函数,只要 class 还没有被定义,它就会被调用,允许你做任何必要的 load/define它。这种情况有没有对应的策略?
也许我可以添加辅助 'fallback' 方法,如下所示:
Object.prototype.fallback = function( undefinedMethod ){
if(this.collection.undefinedMethod){
this.collection.undefinedMethod();
}
};
每次方法未定义时调用它,传入方法。
任何关于这些方面的帮助,或者如果可能的话,将不胜感激。
不要做那种奇怪的事情。如果您想以好的方式做到这一点,请不要污染您不拥有的物体。只需创建您自己的构造函数。
class MyClass {
method1(){ . . . };
method2(){ . . . };
method3(){ . . . };
}
那么您的方法将可用于 MyClass
个实例。
如果你想在所有 Object
个实例上使用你的方法,那么,你需要污染 Object.prototype
。您要求解决方法,但他们基本上会遇到相同的问题。
如果您将方法定义为不可枚举,问题可能会减少,这样它们就不会出现在 for-in
循环中。
Object.prototype.method1 = function(){ . . . };
Object.defineProperty(Object.prototype, 'method1', {enumerable:false});
一种可能的方法是使用新引入的 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
我知道我的标题可能不是很清楚,我会尽力解释我想要实现的目标。
我知道修改原型通常是不受欢迎的,并且有充分的理由,所以我试图找出一种方法来做到这一点而不向原型添加任何超过一个项目。
我知道我可以简单地按照
的方式做一些事情Object.prototype.collection = {};
Object.prototype.collection.method1 = function(){ . . . };
Object.prototype.collection.method2 = function(){ . . . };
Object.prototype.collection.method3 = function(){ . . . };
etc.
然后每当我想使用我可以调用的方法之一时
objectInstance.collection.method1();
这个问题最终会变得冗长乏味,更不用说如果你从这个 collection 调用一百个方法,'collection' 这个词一百次是冗余和浪费字节。
所以我希望有一种以这种方式创建方法的技术,而不必每次都写完整路径。即我可以写
objectInstance.method1();
它会知道去哪里找。
此时我的思考过程是,显然调用后者会引发 method does not exist
错误。但是我很好奇是否有任何方式可以拦截此错误?
例如,在 PHP 中有一个 spl_autoload_register() 函数,只要 class 还没有被定义,它就会被调用,允许你做任何必要的 load/define它。这种情况有没有对应的策略?
也许我可以添加辅助 'fallback' 方法,如下所示:
Object.prototype.fallback = function( undefinedMethod ){
if(this.collection.undefinedMethod){
this.collection.undefinedMethod();
}
};
每次方法未定义时调用它,传入方法。
任何关于这些方面的帮助,或者如果可能的话,将不胜感激。
不要做那种奇怪的事情。如果您想以好的方式做到这一点,请不要污染您不拥有的物体。只需创建您自己的构造函数。
class MyClass {
method1(){ . . . };
method2(){ . . . };
method3(){ . . . };
}
那么您的方法将可用于 MyClass
个实例。
如果你想在所有 Object
个实例上使用你的方法,那么,你需要污染 Object.prototype
。您要求解决方法,但他们基本上会遇到相同的问题。
如果您将方法定义为不可枚举,问题可能会减少,这样它们就不会出现在 for-in
循环中。
Object.prototype.method1 = function(){ . . . };
Object.defineProperty(Object.prototype, 'method1', {enumerable:false});
一种可能的方法是使用新引入的 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