Функции-конструкторы в 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; |
function MyClass() {
this.canWalk = true;
}
MyClass.prototype.Module1 = function() {
alert( 'Привет' );
};
var animal = new MyClass();
animal.Module1();
|
А почему вот так: new MyClass.Module1 код который вы показали не запускается?
И как быть для остальных видов запуска или там аналогично? |
function MyClass() {
this.canWalk = true;
}
MyClass.prototype.Module1 = function() {
alert( 'Привет' );
};
new MyClass().Module1();
все запускается |
а если так:new MyClass.Module1; то не работает
|
Цитата:
так вы можете просто посмотреть console.log(new MyClass.Module1) |
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 Цитата:
UPD2 Цитата:
function MyClass() {
this.prm = "test1";
}
MyClass.Module1 = function Module1() {
return Object(new MyClass().prm);
}
alert(new MyClass.Module1)
|
Работает да, потому что сделали так:
MyClass.Module1 = function Module1() {...} то есть имя метода совпадает с именем функции этого метода. Я такого не встречал раньше, так разве можно делать? |
Цитата:
|
Цитата:
Просто я думал, что new MyClass.Module1 в javascript примерно такое же как и new PHPClass\ClassNamespace\Etc(); в PHP. Это не так, выходит. |
Цитата:
Цитата:
function X() {alert(1)}
X.prototype = {
y: function() {alert(2)}
};
X.y = function() {alert(3)};
X.Y = function Y() {alert(4)}
X.Y.prototype = {
y: function() {alert(5)}
};
X.Y.y = function() {alert(6)};
new X(); // или new X
new X().y();
X.y();
new X.Y(); // или new X.Y
new X.Y().y();
X.Y.y();
Вот тоже самое, но только с синтаксисом класса... Здесь трудно перепутать вложенный класс со статичным методом класса.
class X {
constructor(){alert(1)}
y(){alert(2)}
static y(){alert(3)}
}
X.Y = class Y {
constructor(){alert(4)}
y(){alert(5)}
static y(){alert(6)}
};
new X(); // или new X
new X().y();
X.y();
new X.Y(); // или new X.Y
new X.Y().y();
X.Y.y();
Синтаксис класса является более предпочтительным в языке программирования JavaScript. |
Спасибо за оба примера. Мне по душе 1 вариант написания. Но я так и не понял, а зачем в javascript часто разработчики используют вложенные классы?
И все же в первом варианте у вас используются скобки, а я хотел бы добиться такого вызова: new X.Y; |
Цитата:
Например, у вас есть класс Field описывающий какое-то абстрактное поле:
class Field {
constructor(width, length) {
this.width = width;
this.length = length;
}
}
У поля есть заданные и неизменяемые длина и ширина. Теперь у вам необходимо создать класс Point, описывающий какую-либо точку на поле, и вы думаете: точка на поле не отделима от поля, но точка в общем может использоваться ещё где-нибудь, так зачем же создавать глобальную сущность, которая бы не позволила вложить смысл, например, точке в пространстве? И правильно думаете. И делаете вложенный класс...
class Field {
constructor(width, length) {
this.width = width;
this.length = length;
}
}
Field.Point = class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
};
Вложенный класс - способ представления данных. У вас теперь логически один класс в иерархии относится к другому. Т.е. создание полей и точек теперь будет выглядеть так... const field = new Field(400, 400); const p = new Field.Point(25, 50); Теперь все, кто увидят такую иерархию будут понимать, что Point используется вместе с Field. Цитата:
|
Понял теперь. А есть книги в которых об этом пишут? О том как организовывать большие классы, как их правильно структурировать и прочее?
|
| Часовой пояс GMT +3, время: 07:05. |