Ответы пользователя по тегу ООП
  • Как различать методы и свойства в ооп?

    @f_ban
    Метод - функция, которая представляет собой значение свойства ( es5.javascript.ru/x4.html#x4.3.27 )

    Ну а раз уж мы выяснили что это функция, то...
    Функция - элемент типа Object, являющийся экземпляром стандартного встроенного конструктора Function, который может быть вызван в качестве подпрограммы. ( es5.javascript.ru/x4.html#x4.3.24 )

    ... а следовательно...
    function isFunction(obj){
      return (typeof(obj)) === "function";
    }


    Конкретно у вас, this.name - свойство объекта, создаваемого вызовом конструктора класса FirstClass. FirstClass.prototype.dataName - свойство объекта-прототипа класса FirstClass. Являются они методами или нет, можно выяснить вызовом выше описанной функции isFunction.

    Дело в том, что в спецификации ECMA Script 5 ( es5.javascript.ru ) нет понятия классов как таковых. Зато есть конструкторы объектов (оператор new) которому можно передать практически любую функцию, которая будет использована как функция конструктора. Функции имеют свойство prototype, которое используется для передачи "родительского" поведения и свойств потомкам. Такое наследование называется прототипным.
    При реализации наследования механизм таков. Свойство prototype по сути хранит в себе шаблон объекта, который будет получен при конструировании объекта вызовом оператором new. Есть одно но, свойства объекта из prototype родительского класса записываются не в свойства создаваемого объекта (точнее ссылка целиком на объект, на который ссылается prototype), а в его специальное свойство __proto__ (то есть добавляются в цепочку прототипов).
    Посмотри вот такой трюк.

    // Объявляем первый класс
    Class1 = function(name){this.name = name}
    Class1.prototype.family = "Super Class"
    
    // Объявляем второй класс
    Class2 = function(name){this.name = name;this.family = "Class";}
    // Именно так правильнее указывать родительский класс
    Class2.prototype = Object.create(Class1.prototype)
    
    o = new Class2("MyName");
    
    console.log(o.name);
    console.log(o.family);
    
    // Объект отказался от своего имени и фамилии
    delete o.name;
    delete o.family;
    
    // от имени и фамилии можно отказаться
    console.log(o.name);
    // но не от родовой метки :)
    console.log(o.family);


    Дело в том, что свойство family было удалено из объекта, но оно есть в объекте, на который ссылается свойство o.__proto__, следуя по цепочке прототипов интерпретатор находит свойство family и возвращает его значение
    Ответ написан
    5 комментариев