0

Я знаю, что мой титул может быть не совсем ясным, я постараюсь изо всех сил объяснить, чего я пытаюсь достичь.Javascript, прототип объекта - избегайте писать полный путь

Я знаю, что модификация прототипов, как правило, неодобрительно, и по уважительной причине я пытаюсь выяснить способ сделать это, не добавляя в прототип не более одного элемента.

Я знаю, что я мог бы просто сделать что-то вдоль линий

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(); 

    } 
}; 

И просто это называется каждый раз, когда метод является неопределенным, переходящим в методе.

Любая помощь для чего-либо в этом направлении, или если это возможно, будет очень признательна.

+0

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

+0

Я иду посмотреть на это немного больше, но это похоже на то, что мне нужно! Спасибо! –

+0

Просто убедитесь, что ваш хост поддерживает это, и он должен делать то, что вам нужно. Дайте мне знать, если это вам подходит, я мог бы опубликовать это как ответ. –

ответ

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 
1

Не делайте странных вещей. Если вы хотите сделать это хорошо, не загрязняйте объект, который у вас нет. Просто создайте свой собственный конструктор.

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

тогда ваши методы будут доступны для MyClass экземпляров.

Если вы хотите использовать свои методы на всех экземплярах Object, вам необходимо загрязнить Object.prototype. Вы просите об обходных решениях, но у них будут в основном те же проблемы.

Это может быть проблематично, если вы определяете свои методы как неперечислимые, таким образом они не будут отображаться в циклах for-in.

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

Это только моя точка зрения, но я не могу этого сделать. Для длины я не включал это в свой вопрос, но суть этого заключается в том, чтобы создать пользовательский back-end/framework для серии плагинов, которые я создаю. И я также хочу, чтобы структура была доступна для других, чтобы строить сверху. Опять же, ради длины, просто знайте, что у меня есть все основания не использовать другие рамки. Я хотел бы избежать JQuery-подобной проблемы неспособности использовать пользовательские методы для переменных, не объявленных с использованием фреймворка, и именно поэтому я не буду использовать этот маршрут. Я ценю ваше понимание и время. –