Jump to content
  • 0

Запуталась с this


amelice
 Share

Question

var globalObject = {  setClasses: {    next: function (el) {      console.log(el);    },    prev: function () {    }  },  moveElems: {    top: function () {         //как обратиться к setClasses.next(someElem)?    },    left: function () {    }  }}

Привет всем!

Вопрос в коде, мне нужно из свойства top объекта moveElems обратиться к свойству next объекта setClasses.  this внутри свойства top будет обращаться к moveElems, а как обратится globalObject, чтоб можно вызвать setClasses.next(someElem)?

 

Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0

В данном случае никак, т.к. объект globalObject еще не будет создан на момент обращения.

 

Наврал:

var globalObject = {  setClasses: {    next: function (el) {      console.log(el);    },    prev: function () {    }  },  moveElems: {    top: function () {         globalObjec.setClasses.next('xxx');    },    left: function () {    }  }}
  • Like 1
Link to comment
Share on other sites

  • 0

 

В данном случае никак, т.к. объект globalObject еще не будет создан на момент обращения.

 

Наврал:

var globalObject = {  setClasses: {    next: function (el) {      console.log(el);    },    prev: function () {    }  },  moveElems: {    top: function () {         globalObjec.setClasses.next('xxx');    },    left: function () {    }  }}

Спасибо, мне кажется странным внутри объекта globalObject обращаться к нему же через его имя.  Так нормально писать код, я имею в виду синтаксически или вообще по правилам?

Link to comment
Share on other sites

  • 0

@amelice, переменные - существительные, функции - глаголы. Т.о. "setClasses" и "moveElems" должны быть функциями.

Также неудачно выбрано имя переменной "globalObject", т.к. в среде уже существует глобальный объект (будет путаница).

Что касается кода, то в твоем случае можно сделать так:

var object = {    setNextClass: function() {    },    setPrevClass: function() {    },    moveElementToTop: function() {    },    moveElementToLeft: function() {    }};// orvar object = {    setClass: function(name) {    },    moveElement: function(x, y) {    }};
Если очень хочется, я бы делал так:

function Foo() {    this.bar = new Bar(this);}Foo.prototype.setClass = function(name) {};Foo.prototype.moveElement = function(x, y) {};function Bar(parent) {    this.parent = parent;}Bar.prototype.doSomething = function(name) {    this.parent.setClass(name);};var object = new Foo();object.bar.doSomething('class');
В целом, лучше взять за правило описывать ключевые объекты классами, а не литерами.

При данном подходе можно строить цепочку parent -> child, использовать наследование, вызывать супер методы или просто создать еще один экземпляр.

Это мое мнение =)

Edited by nerv
  • Like 1
Link to comment
Share on other sites

  • 0

nerv, спасибо за рекомендации по поводу имен переменным.  Я это знаю.  Назвала "globalObject" только чтоб сделать акцент что он такой весь большой и глобальный, который содержит в себе много других обьектов.

По поводу твоего примера - у меня взрыв мозга...  :dash:  Можешь словами пояснить плиз?
Как я понимаю, что в  Foo создается экземпляр Bar.  а в Bar ссылаемся и добавляем метод к Foo?  а через prototyp'ы расширяем объекты?
 

Link to comment
Share on other sites

  • 0
Вопрос в коде, мне нужно из свойства top объекта moveElems обратиться к свойству next объекта setClasses. this внутри свойства top будет обращаться к moveElems, а как обратится globalObject, чтоб можно вызвать setClasses.next(someElem)?

Самый короткий и правильный ответ будет: так делать нельзя. Делайте объект линейным и будет вам счастье.

Link to comment
Share on other sites

  • 0

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

 

 

Как не позволяет? Я же обратился к globalObject.

Нет, так можно, конечно. Я про изначальный вопрос.

 

То не позволяет, то позволяет.

Я не про логику спрашивала, а можно ли так обращаться.

 

Link to comment
Share on other sites

  • 0
Я не про логику спрашивала, а можно ли так обращаться.

Нет, обращаться так нельзя, я так изначально и написал. Никакой конструкции типа this.parent не существует.

  • Like 1
Link to comment
Share on other sites

  • 0

Я это знаю

но не соблюдаю =)

Что именно не ясно? Если не знаешь, что такое "прототип функции", читай.

Как я понимаю, что в  Foo создается экземпляр Bar

да

а в Bar ссылаемся и добавляем метод к Foo?

не добавляем, в вызываем
Link to comment
Share on other sites

  • 0
но не соблюдаю =)

Соблюдаю, соблюдаю. )

 

Если не знаешь, что такое "прототип функции", читай.

 

Читала когда-то, но не поняла.

 

Что именно не ясно?

 

Обясни, почему нужно писать два больших класса, чтобы можно было обращаться к this первого?

 

Edited by amelice
Link to comment
Share on other sites

  • 0

Обясни, почему нужно писать два больших класса, чтобы можно было обращаться к this первого?

Во-первых, это не обязательно

var object1 = {    method: function() {        alert(1);    }};var object2 = {    parent: object1,    method: function() {        this.parent.method();    }};object2.method();object2.parent.method();
Во-вторых, описанные мною выше классы крошечные =)

В-третьих,

В целом, лучше взять за правило описывать ключевые объекты классами, а не литерами. При данном подходе можно строить цепочку parent -> child, использовать наследование, вызывать супер методы или просто создать еще один экземпляр. Это мое мнение =)

Если ты не используешь многоуровневое наследование в js, вызовы супер-методов и т.п., конечно, тебе сложно понять зачем оно надо =)

Вероятно, ты начнешь использовать классы, когда потребуется создавать >1 экземпляра объекта. Это будет отправной точкой.

Опять-таки, не каждый объект следует описывать классом (js позволят не описывать объекты классами), а только значимые.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By AlexandraM
      Требования:
      Опыт работы с веб-технологиями от 3-x лет
      Хорошее знание JavaScript
      Опыт работы с шаблонами JavaScript MVC/MVVM, фреймвoрками и библиотеками AngularJS, jQuery, Bootstrap
      Хорошее знание сопутствующих технологий: HTML, HTML5, CSS
      Опыт объектно-ориентированного программирования (OOP) в JavaScript
      Понимание протокола WebSockets
      Обязанности:
      Проектирование пользовательских интерфейсов
      Реализация frontend приложений
      Написание документации по разработанным модулям
      Условия:
      Оформление согласно ТК РФ
      Профессиональный и карьерный рост
      Стабильность и конкурентоспособная заработная плата
      Программы развития: конференции, семинары, курсы, тренинги
      Работа в офисе, Москва, м.Ботанический сад / Работа удаленно
      Размер компенсации обсуждается по результатам собеседования
       
      Alexandra M | HR Manager | Altarix
      Mobile: +7 929 540 40 69| Skype: alexfoxsy | am@altarix.ru
    • By WhatIsHTML
      Задача : при клике на активное изображение в слайдере открывается Fancybox, который содержит это изображение. 
       
      Структура html примерно следующая. "flex-active-slider" применяется динамически и обозначает активное на данный момент изображение. 
      <ul> <li class="flex-active-slider"> <img src="img1.png"> </li> <li class=""> <img src="img2.png"> </li> <li class=""> <img src="img3.png"> </li></ul>JS:
      $(window).load(function() {$(".flex-active-slide").click(function() { var img = $(this).find('img'); $.fancybox.open([ { href: "img.attr('src')" } ]);});}В итоге, fancyvox вообще не открывается, т.е. никак не реагирует на клик. 
    • By andrey7287
      Накодил вот для практики такую вот штуку.
       
      http://jsfiddle.net/Andrey7287/7og3qybh/7/show/
       
       При запуске без аргументов создаёт поле 20x20 в  body страницы.
       Доступны параметры.
      {
        elem: 'id',  // id элемента-контейнера (string)
        rows: '20, // кол-во строк (number)  cells: 20, // кол-во столбцов (number)  level: 3 // стартовый уровень (number > 0)} 
       
      Прошу оценить понятность и адекватность кода. 
       
      upd:
      http://jsfiddle.net/Andrey7287/7og3qybh/8/show/
    • By afdw
      В JS есть проблема, связанная с доступом к this в анонимной функции:

      this.test = 2 * 2;console.log(this.test); // 4callback(function(){ console.log(this.test); // undefined});Я знаю два способа её решения:Создать ссылку на this:
      this.test = 2 * 2;console.log(this.test); // 4var self = this;callback(function(){ console.log(self.test); // 4}); Использовать метод "bind" для подмены this: 

      this.test = 2 * 2;console.log(this.test); // 4callback((function(){ console.log(this.test); // 4}).bind(this)); Первый способ мне не нравится из-за введение дополнительной переменной. Второй - из-за лишних скобок и в следствии этого ухудшения читабельности. Знаете ли вы более элегантные решения этой проблемы?
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy