class TotallyNotAjQuery {
constructor() {
this.inf = {
$el: null
}
this.el = this.el.bind(this);
}
el(selector) {
this.inf.$el = document.querySelector(selector);
return this;
}
styles(stylesObj) {
for(const primary in stylesObj) {
this.inf.$el.style[primary] = stylesObj[primary];
}
return this
}
on(event, func) {
this.inf.$el.addEventListener(event, func);
return this;
}
}
const {el: $} = new TotallyNotAjQuery();
$(".title").styles({
color: "red"
}).on("click", () => {
console.log("click");
});
В примере ниже, метод makeInterviewer(): Interviewer возвращает тип интерфейса Interviewer.Этот метод ничего не возвращает, а только объявляет требования к наследникам - они должны реализовать этот абстрактный метод и уже вернуть конкретный объект, реализующий интерфейс Interviewer.
interface Interviewer {
public function askQuestions();
}
abstract class HiringManager {
abstract public function makeInterviewer(): Interviewer;
public function takeInterview() {
$interviewer = $this->makeInterviewer();
$interviewer->askQuestions();
}
}
class TeamLead implements Interviewer {
public function askQuestions() {
...
}
}
class Boss extends HiringManager {
public function makeInterviewer(): Interviewer {
return new TeamLead();
}
}
вроде как подсовываю String. Как эту проблему решить? Хочу, чтобы адрес был отдельным классомНу так сделайте отдельный класс и передавайте его, в чём проблема-то?
new Person("Harry Potter", 40, new Address("Baker street 20"), new Address("Manchester"), new Address("United Kingdom"));
Статические ссылки на текущий класс, такие как self:: или __CLASS__, вычисляются используя класс, к которому эта функция принадлежит, как и в том месте, где она была определенаПозднее статическое связывание
...
Позднее статическое связывание пытается устранить это ограничение, предоставляя ключевое слово, которое ссылается на класс, вызванный непосредственно в ходе выполнения.
public static function getMessage(): string
{
return 'message - ' . static::getString();
}
Для чего служат подобные вызовы и что конкретно в них проиходит?Это не вызовы, а тайпхинты - подсказки типов для интерпретатора. Нужны они только для того, чтобы в рантайме выбросилось исключение, если в функцию был передан аргумент некорректного типа.
Задался вопросом почему объект класса не совместим с типом object.Наоборот - это object несовместим с MyObject.
interface Extractable
{
public function extract(): array;
}
class MyObject implements Extractable
{
public $a;
public function extract(): array
{
return [
'a' => $this->a,
];
}
}
class MyOtherObject implements Extractable
{
public $a, $b, $c;
public function extract(): array
{
return [
'a-b' => $this->a . $this->b,
'c' => $this->c->toArray(),
];
}
}
Играет ли какую-то роль в конструкторе Machine этот код ?Разумеется, играет - иначе бы его не было в учебнике.
Для чего нужен var parentDisable = this.disable; и его вызов parentDisable();На следующей строке this.disable переопределяется собственной логикой, поэтому нужно сохранить родительский функционал, чтобы использовать его и избежать дублирования логики.
Почему при описании класса должно присутствовать и то, и другое?С чего вы взяли? Может не быть ни того, ни другого.
Чем в классах JavaScript по функционалу различаются constructor и set?Сеттеры отвечают за установку значения одного конкретного свойства; конструктор - за инициализацию объекта в целом.
И для чего нужно _dogName, если есть просто dogName?Не может быть у объекта свойства (_dogName) и метода-сеттера (dogName) с одинаковым названием.
class Dog
{
constructor(dogName)
{
this.dogName = dogName;
}
}
let dog = new Dog("Rex");
console.log(dog.dogName);
/** @return self */
(чтобы IDE не сходила с ума), что и вовсе убивает весь профит.this
в A.foo
ссылается не на A
, а на инстанс B
. А поиск метода идёт по цепочке прототипов, начиная сверху, поэтому до A.bar никогда не доходит.Обязательно ли создавать экземпляр? Или можно обойтись статическими методами
echo Form::getError();
. Откуда статический метод будет получать информацию об ошибке формы? Как он будет отличать ошибки одной формы от другой?Единственное что знаю, экземпляр надо создавать тогда, когда он оперирует уникальными даннымиЭкземпляр нужен тогда, когда у него есть какое-то собственное состояние (ошибки валидации, например). У двух объектов состояние может совпадать (то есть быть неуникальным), но это не значит, что в следующий момент один из них не изменится.
var put = function(elem, text) {
var text = encodeURIComponent(text);
return {
now: function(a) {
var a = encodeURIComponent(a) || '';
return {
add: function() {
elem.outerHTML += text + a;
},
replace: function() {
elem.outerHTML = text + a;
},
}
},
after: function(time) {
// do smth
},
}
}
put(document.getElementById("div_id"), "Hello ").now("world!").replace();
Подскажите для чего нужна выделенная строка или вообще не нужна в данном коде?Поскольку в js нет нативных неймспейсов, используется именно такой способ их "эмуляции". Но учитывая, что потом объявляется одноименная функция, внутри которой ещё и прототип переопределяется, приведённый код - полная хрень.
var app = app || {};
app.myModule = (function () {
connect: function(){}
})()
Шаблон Адаптер позволяет в процессе проектирования не принимать во внимание возможные различия в интерфейсах уже существующих классов. Если есть класс, обладающий требуемыми методами и свойствами (по крайней мере, концептуально), то при необходимости всегда можно воспользоваться шаблоном Адаптер для приведения его интерфейса к нужному виду.
class Entity implements FirstInterface, SecondInterface
interface I {}
class A {}
class B extends A implements I {}
$obj = [
'a' => function(){ return 1; },
'b' => [
'ba' => function(){ return 2; },
'bb' => [
'bba' => function(){ return 3; }
]
]
];
$obj['a']();
$obj['b']['ba']();
$obj['b']['bb']['bba']();