Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функции-конструкторы в JS (https://javascript.ru/forum/misc/76470-funkcii-konstruktory-v-js.html)

Начинающий-Js-кодер 14.01.2019 20:02

Функции-конструкторы в JS
 
Сейчас изучаю конструкторы, прототипы и у одной небезызвестной библиотеки встретил такого плана код:
new go.Binding("points").makeTwoWay()

если как сделать
new MyClass();
я понимаю,код вот:
function MyClassl(name) {
  this.name = name;
  this.canWalk = true;
}

var animal = new MyClass();
, то как сделать
new MyClass.Module1();
не понимаю, пробовал вот так:
function MyClass() {
  // вспомогательная переменная
  var phrase = "Привет";

  this.Module1 = function() {
    alert( phrase ); // использование
  };
}

new MyClass.Module1();

так не работает, пробовал так:
function MyClass() {

  this.prm = "test1";
function Module1() {
      return "Module1";
    }
  return { Module1: Module1 };  
}
при вызове
alert( new MyClass.Module1() );
ничего не срабатывает.

И видел, что некоторые делают еще так:
new go.Binding("points").makeTwoWay(),

На сайте в разделе по конструкторам не нашел такое, и хотело бы узнать, зачем делаются три такие конструкции и как они так делаются, что можно вызвать new MyClass.Module1.Submodule1;

j0hnik 14.01.2019 20:18

function MyClass() {
  this.canWalk = true;
}
MyClass.prototype.Module1 = function() {
	alert( 'Привет' );
};

var animal = new MyClass();
animal.Module1();

Начинающий-Js-кодер 14.01.2019 20:39

А почему вот так: new MyClass.Module1 код который вы показали не запускается?
И как быть для остальных видов запуска или там аналогично?

j0hnik 14.01.2019 20:41

function MyClass() {
  this.canWalk = true;
}
MyClass.prototype.Module1 = function() {
	alert( 'Привет' );
};

new MyClass().Module1();


все запускается

Начинающий-Js-кодер 14.01.2019 20:45

а если так:new MyClass.Module1; то не работает

j0hnik 14.01.2019 20:48

Цитата:

Сообщение от Начинающий-Js-кодер
а если так:new MyClass.Module1; то не работает

методы вызываются скобками
так вы можете просто посмотреть console.log(new MyClass.Module1)

Malleys 14.01.2019 20:49

function MyClass() {}

MyClass.Module1 = function Module1() {
	var phrase = "Привет";
	alert(phrase);
}

new MyClass.Module1();


function MyClass() {
	this.prm = "test1";
}

MyClass.Module1 = function Module1() {
	return Object(new MyClass().prm);
}

alert(new MyClass.Module1())


UPD
Цитата:

Сообщение от j0hnik
все запускается

То, что вы метод назвали как в C#, никак его автомагический не сделает классом. Вы вызываете метод, а не класс.

UPD2
Цитата:

Сообщение от Начинающий-Js-кодер
а если так:new MyClass.Module1; то не работает

Вообще-то работает,
function MyClass() {
	this.prm = "test1";
}

MyClass.Module1 = function Module1() {
	return Object(new MyClass().prm);
}

alert(new MyClass.Module1)

Начинающий-Js-кодер 14.01.2019 21:14

Работает да, потому что сделали так:
MyClass.Module1 = function Module1() {...}
то есть имя метода совпадает с именем функции этого метода. Я такого не встречал раньше, так разве можно делать?

j0hnik 14.01.2019 21:16

Цитата:

Сообщение от Malleys
То, что вы метод назвали как в C#, никак его автомагический не сделает классом. Вы вызываете метод, а не класс.

Я и не говорил что это класс

Начинающий-Js-кодер 14.01.2019 21:40

Цитата:

То, что вы метод назвали как в C#, никак его автомагический не сделает классом. Вы вызываете метод, а не класс.
То есть в javascript нет возможности при исполнении такой строки new MyClass.Module1 вызвать именно конструктор new MyClass.Module1 а не MyClass и его метод Module1?
Просто я думал, что new MyClass.Module1 в javascript примерно такое же как и new PHPClass\ClassNamespace\Etc(); в PHP. Это не так, выходит.


Часовой пояс GMT +3, время: 13:04.