← Назад к вопросам

Как получить GET-запрос без JavaScript средствами CSS?

2.0 Middle🔥 132 комментариев
#HTML и CSS

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Получение и работа с прототипами в JavaScript

Прототип - это объект, от которого наследуют свойства и методы другие объекты. JavaScript использует прототипное наследование, и понимание работы с прототипами критично для разработки.

Object.getPrototypeOf()

Основной способ получить прототип объекта:

const user = { name: 'John' };
const proto = Object.getPrototypeOf(user);

console.log(proto);  // Object { ... }
console.log(proto === Object.prototype);  // true

// Проверка наследования методов
console.log('toString' in user);  // true (наследовано от прототипа)
console.log(user.hasOwnProperty('toString'));  // false (не свойство объекта)

proto (Неофициальное свойство)

Устаревший способ, но всё ещё работает:

const user = { name: 'John' };
console.log(user.__proto__);  // Object { ... }
console.log(user.__proto__ === Object.prototype);  // true

// ИЗБЕГАЙ устанавливать __proto__ напрямую
user.__proto__ = null;  // Плохая идея

Предпочитай Object.getPrototypeOf() - это стандартный и более безопасный способ.

Цепочка прототипов (Prototype chain)

Объекты наследуют свойства от цепочки прототипов:

const animal = { eats: true };
const dog = Object.create(animal);  // dog наследует от animal
dog.barks = true;

const myDog = Object.create(dog);
myDog.name = 'Rex';

console.log(myDog.name);    // 'Rex' (своё свойство)
console.log(myDog.barks);   // true (из dog)
console.log(myDog.eats);    // true (из animal)

// Цепочка прототипов:
// myDog -> dog -> animal -> Object.prototype -> null

// Вывести всю цепочку
let current = myDog;
while (current) {
  console.log(current);
  current = Object.getPrototypeOf(current);
}

Object.create()

Создание объекта с явно указанным прототипом:

const parent = {
  greet() {
    return `Hello, ${this.name}`;
  }
};

const child = Object.create(parent);
child.name = 'John';

console.log(child.greet());  // 'Hello, John'
console.log(Object.getPrototypeOf(child) === parent);  // true

// С дополнительными свойствами
const person = Object.create(parent, {
  name: { value: 'Jane', writable: true },
  age: { value: 30, writable: true }
});

Функции-конструкторы и прототипы

function User(name, email) {
  this.name = name;
  this.email = email;
}

// Методы в прототипе функции-конструктора
User.prototype.greet = function() {
  return `Hello, ${this.name}`;
};

User.prototype.toString = function() {
  return `User: ${this.name} <${this.email}>`;
};

const user1 = new User('John', 'john@example.com');
const user2 = new User('Jane', 'jane@example.com');

console.log(user1.greet());         // 'Hello, John'
console.log(Object.getPrototypeOf(user1) === User.prototype);  // true

// Все экземпляры делят методы
console.log(user1.greet === user2.greet);  // true (один и тот же метод)

Классы (Синтаксический сахар для прототипов)

class User {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  greet() {
    return `Hello, ${this.name}`;
  }
}

const user = new User('John', 'john@example.com');
console.log(Object.getPrototypeOf(user) === User.prototype);  // true
console.log(user.greet());  // 'Hello, John'

// Классы - это просто прототипы с более удобным синтаксисом

Наследование через прототипы

// Функции-конструкторы
function Animal(name) {
  this.name = name;
}

Animal.prototype.eat = function() {
  console.log(`${this.name} eats`);
};

function Dog(name, breed) {
  Animal.call(this, name);  // Вызвать конструктор родителя
  this.breed = breed;
}

// Наследование прототипа
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;  // Восстановить конструктор

Dog.prototype.bark = function() {
  console.log(`${this.name} barks`);
};

const dog = new Dog('Rex', 'Labrador');
dog.eat();   // 'Rex eats' (из Animal)
dog.bark();  // 'Rex barks' (из Dog)

// Или с классами (проще):
class Animal {
  constructor(name) {
    this.name = name;
  }
  eat() { console.log(`${this.name} eats`); }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }
  bark() { console.log(`${this.name} barks`); }
}

Проверка наследования

const user = new User('John');

// Проверить, является ли user экземпляром User
console.log(user instanceof User);  // true
console.log(user instanceof Object);  // true

// Проверить, является ли User.prototype в цепочке прототипов user
console.log(User.prototype.isPrototypeOf(user));  // true

// Получить прототип
console.log(Object.getPrototypeOf(user) === User.prototype);  // true

Собственные vs наследованные свойства

const user = new User('John');
User.prototype.role = 'user';

// Собственные свойства
console.log(Object.getOwnPropertyNames(user));  // ['name', 'email']

// Все свойства (включая наследованные)
for (let key in user) {
  console.log(key);  // name, email, role, greet, toString, ...
}

// Только собственные
for (let key in user) {
  if (user.hasOwnProperty(key)) {
    console.log(key);  // name, email
  }
}

// Современный способ
Object.entries(user).forEach(([key, value]) => {
  console.log(key, value);  // name, email
});

Модификация прототипа

// Добавить метод в встроенный прототип (очень редко)
Array.prototype.last = function() {
  return this[this.length - 1];
};

const arr = [1, 2, 3];
console.log(arr.last());  // 3

// ИЗБЕГАЙ этого для встроенных типов!
// Лучше используй подклассы или обёртки

Проверка прототипа объекта

function describeObject(obj) {
  console.log('Object:', obj);
  console.log('Prototype:', Object.getPrototypeOf(obj));
  console.log('Constructor:', obj.constructor.name);
  console.log('Prototype chain:');
  
  let proto = Object.getPrototypeOf(obj);
  let level = 0;
  while (proto) {
    console.log(' '.repeat(level * 2) + '-> ' + (proto.constructor?.name || 'null'));
    proto = Object.getPrototypeOf(proto);
    level++;
  }
}

describeObject(new User('John'));

Прототипы - основа JavaScript наследования. Используй Object.getPrototypeOf() для получения прототипа и modern классы для создания новых объектов.

Как получить GET-запрос без JavaScript средствами CSS? | PrepBro