Как создать родительский объект по умолчанию для вызова функции внутри определенной области, такой как объект window?

#javascript

#javascript

Вопрос:

Мне нужен способ сделать родительский объект для любого «известного» вызова функции внутри определенной области определенным объектом, например, как объект window: в javascript нам не нужно писать window.document.querySelector мы можем написать document.Непосредственно в querySelector мне нужно реализовать ту же идею в моем приложении, но я не могу определить алгоритм ее создания?

мое приложение работает следующим образом:

программист (я программирую библиотеку) передаст объект внутри метода с именем «move», метод «move» примет этот объект, который будет выглядеть следующим образом:

 DOMMAP:{
A:{
onfirstload(){

    override() // I want this one to be like window.something, I want this to be automatically myLibrary.override() without forcing the user of my library to write manually myLibrary.override()

}
}
}
  

MyLibrary — это класс, у которого есть методы, метод «переопределения» является одним из «известных» методов:

 class myLibrary{
override(){
//do something
}
move(DOMMAP){
//traverse the DOMMAP object... do some magic
}
}
  

Я хочу, чтобы это было похоже на window.something, я хочу, чтобы это было автоматически MyLibrary.override(), не заставляя пользователя моей библиотеки писать вручную MyLibrary.override()

Я хочу, чтобы эта вещь (глобальный объект с точки зрения внутренних функций, который автоматически устанавливался в MyLibrary) находилась внутри области действия метода свойства «onfirstload».

Комментарии:

1. JavaScript использует лексическую область, то есть то, к каким значениям может обращаться функция, зависит от ее местоположения в исходном коде и определяется во время определения. Вы не можете изменить область действия функции после того, как она была определена. Единственный способ сделать это, если бы вы сделали window.override = myLibrary.override при инициализации библиотеки, то есть создали глобальные переменные самостоятельно. Однако это не кажется мне отличным подходом. Почему бы не оставить разработчику, как они хотят вызывать методы вашей библиотеки?

2. Вы можете попробовать использовать this вместо этого bind или apply или call , чтобы изменить контекст вызова функции. Это не то же самое, что требования, которые вы устанавливаете, но было бы понятнее явно ограничить область экземпляром.

3. @Mike, да, я понимаю… Я не знаю.. Я читаю документацию «с»…

4. @FelixKling, потому что этот синтаксис короче, чище и его легче читать и понимать

5. Я добавил with документ только для того, чтобы ответить на ваш вопрос напрямую. Хотя это для более короткого и чистого кода, with вносит двусмысленность, которая может вызвать ошеломляющие ошибки. Попробуйте ознакомиться с другими методами, которые я предложил!

Ответ №1:

Раньше у нас был, with но это не рекомендуется.

Что я могу предложить, так это использовать this и bind . Вы можете иметь функцию в своем объекте следующим образом.

 {
  onfirstload(){
    this.override()
  }
}
  

Затем вызовите bind свой move метод.

 class myLibrary{
    override(){
        //do something
    }
    move(DOMMAP){
        DOMMAP.onfirstload.bind(this)()
    }
}
  

Выполнение привязки изменяет контекст this экземпляра класса.

Комментарии:

1. Вы можете заменить .bind(this)() на .call(this) .

2. Это идея, но я думаю, что пользователю проще написать MyLibrary.override(), а не this.override(), потому что $this может ввести пользователя в заблуждение, потому что он никогда не узнает, что я связываю метод this context с классом, пока он не прочитает исходный код библиотеки

3. @GirkovArpa, да, в случае моего кода я бы использовал call() напрямую

4. Ясность вашей библиотеки зависит от вас. Вы можете проверить, как это делают разные библиотеки. MatterJS использует вызовы методов, подобные тому, как вы описываете. Render.run(render) . VueJS делает это так, как я описал. mounted метод в объекте, переданном Vue, указывает, что this относится к текущему экземпляру. Суть в том, что если вы достаточно хорошо документируете свою библиотеку и она достаточно последовательна, ясность не будет проблемой.

Ответ №2:

Вы можете создать отдельный файл .js, в котором вы можете создать класс и импортировать его методы как тип VAR. А затем импортируйте этот файл в корневой файл. Он был бы доступен для всех файлов.