Перейти к содержимому

Instanceof js что это

  • автор:

JavaScript: Оператор instanceof

Оператор instanceof выполняет проверку на принадлежность объекта к указанному типу. Если проверяемый объект принадлежит к указанному типу, результатом будет значение true , иначе – false . Если левый операнд не является объектом, возвращается false . Если правый операнд не является функцией, возникает ошибка:

function A()<> function C()<> var o = new C(); alert(o instanceof C); // true alert(o instanceof A); // false var arr = []; alert(arr instanceof Array); // true var x = ""; var y = 1; alert(x instanceof Object); // false alert(x instanceof y); // Ошибка. y не является функцией

Оператор in

Оператор Тип оператора А О Типы значений
… in … Проверка наличия свойства слева направо 2 строка, объект → булево

Оператор in выполняет проверку наличия свойства в объекте. Если проверяемое свойство есть в объекте (собственное или наследуемое), результатом будет значение true , иначе – false :

var obj = ; alert("x" in obj); // true alert("a" in obj); // false var arr = [1]; alert("0" in arr); // true alert(0 in arr); // true. 0 преобразован в "0" alert(1 in arr); // false

С этой темой смотрят:

  • Операторы. Приоритет операторов
  • Математические операторы
  • Присваивание
  • Операторы void, группировки, запятая
  • Операторы сравнения
  • Логические операторы
  • Побитовые операторы

Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2024 © puzzleweb.ru | razumnikum.ru

Приватные методы и свойства, оператор instanceof

Согласно концепции инкапсуляции ООП в классах можно создавать как открытые (публичные) методы и свойства, так и закрытые, доступные только внутри класса или его объектов. До сих пор все методы и свойства у нас были публичные. Но, что если мы хотим некоторые из них указать как приватные, закрытые? Например, в классе Users такими сделать свойства name и old:

class Users { constructor(name, old) { this.name = name; this.old = old; } getName() { return this.name; } }
  • _name, _old – приватные свойства;
  • _setProperty(key, value) – приватный метод.
constructor(name, old) { this._name = name; this._old = old; }

Мы к ним, тем не менее, можем совершенно спокойно обращаться из вне:

console.log( u1._name );

Но это уже остается на совести программиста и, вообще, считается порочной практикой, т.к. такие свойства в будущем (в другой версии модуля) могут измениться или совсем исчезнуть и тогда придется переделывать и саму программу, что не очень приятно. Поэтому, отмеченные таким образом атрибуты, следует использовать исключительно внутри класса. Таково общепринятое соглашение. Разумеется, как обычные свойства, условно-приватные также наследуются и доступны в дочерних классах. Например, объявим метод getName как приватный:

_getName() { return this._name; }

и создадим дочерний класс Admin:

class Admin extends Users { constructor(name, old, login, psw) { super(name, old); this.login = login; this.psw = psw; } }

Тогда после создания объекта:

let u2 = new Admin("Кирилл", 22, "admin", "1111");

мы совершенно спокойно можем вызвать метод базового класса:

console.log( u2._getName() );

даже, если он по соглашению приватный. Это еще раз показывает, что закрытые методы – это лишь соглашение между программистами, языком JavaScript они воспринимаются как обычные методы и свойства.

Настоящие приватные свойства

Совсем недавно в JavaScript появилась возможность объявлять «настоящие» приватные свойства, которые становятся защищенными на уровне языка, а не просто соглашения между программистами. Для их обозначения перед именами ставится символ шарп: # <имя свойства>— защищенное свойство. Например, в классе Users для объявления таких свойств мы должны, во-первых, указать их непосредственно в классе:

class Users { #name; #old; constructor(name, old) { this.#name = name; this.#old = old; } getName() { return this.#name; } }

А, затем, уже можем использовать в экземплярах классов:

let u1 = new Users("Михаил", 19); let u2 = new Admin("Кирилл", 22, "admin", "1111"); console.log( u1.getName() ); // Михаил console.log( u2.getName() ); // Кирилл

Как видите, в консоли выводятся разные имена, следовательно, для каждого объекта приватное свойство является уникальным и хранится непосредственно в нем. Если же мы попытаемся обратиться к такому свойству из вне:

console.log( u1.#name );

то возникнет ошибка. Это как раз и показывает, что такие свойства по-настоящему приватные и могут изменяться только внутри класса или его объектах. У таких свойств есть один нюанс: обращаться к ним по синтаксису: this[<ключ>] нельзя. Например, если в методе getName записать:

getName() { return this['#name']; }

то получим значение undefined. Тогда, как с обычными свойствами все работало бы без проблем. Вот так в JavaScript можно объявлять и работать с приватными свойствами и методами.

Оператор instanceof

В JavaScript есть довольно полезный и часто используемый оператор obj instanceof Class который проверяет принадлежность объекта obj классу Class, то есть, возвращает true, если obj действительно является экземпляром класса Class (или, любому базовому классу) и false – в противном случае. Например, в нашей программе можно реализовать следующую проверку:

console.log( u1 instanceof Admin); // false console.log( u2 instanceof Admin ); // true

А, вот если вместо Admin написать Users:

console.log( u1 instanceof Users); console.log( u2 instanceof Users);

то в обоих случаях получим true. Это, как раз, и показывает, что оператор instanceof выполняет проверку принадлежности с учетом наследования классов. Это отличает данный оператор от простого сравнения:

console.log( u1.constructor == Users); console.log( u2.constructor == Users);

Здесь свойство constructor (если оно есть и не было искусственно изменено) хранит ссылку на функцию-конструктор, с помощью которой и был создан текущий объект. А, так как класс – это и есть функция-конструктор, то мы, таким образом, проверяем соответствие объекта тому или иному классу. Вот так в JavaScript можно определять тип объекта с помощью оператор instanceof и простой проверкой на равенство.

Сравнение JavaScript операторов typeof и insanceof

В JavaScript есть операторы typeof и instanceof, на первый взгляд они похоже, но они выполняют разные функции.

В этой статье будет рассмотрена разница между ними и показаны примеры использования.

Typeof оператор

Оператор typeof используется, в основном, для того, чтобы узнать тип примитивного значения.

Если у нас есть числа, больше числа, строки, символы, логические или неопределенные значения мы можем узнать их с помощью оператора.

К примеру, у нас есть :

console.log(typeof 1); 

В терминале отобразится ‘number’.

Более полезно, когда у нас есть переменные:

 let foo = 1; console.log(typeof foo); 

В таком случае мы можем использовать typeof, чтобы узнать тип переменной foo.

Важно запомнить, что typeof не следует использовать для null, если мы напишем:

 console.log(typeof null);

В терминале отобразится ‘object’. Вместо этого следует использовать оператор === ://

 foo === null

Другой пример содержит boolean значения.

typeof false === 'boolean'; typeof Boolean(0) === 'boolean';

Мы также можем проверить числа следующим образом:

typeof Number('1') === 'number'; typeof Number('foo') === 'number'; typeof NaN === 'number';

Обратите внимание, что NaN и вычисления, которые возвращают NaN, такие как Number(‘foo’ ), также относятся к типу ‘number’ . Мы должны проверить их с помощью метода Number.isNaN().

 typeof 2n === 'bigint';
typeof '' === 'string'; typeof 'foo' === 'string';
typeof Symbol() === 'symbol' typeof Symbol('bar') === 'symbol'

Также, можно использовать typeof для определения типа undefined:

typeof undefined === 'undefined'; let x; typeof x === 'undefined';

Можно использовать для объектов, однако все объекты возвращают тип ‘object’, так что это не очень полезно:

typeof new String('foo') === 'object'; typeof new Number(1) === 'object';

Некоторые старые браузеры возвращают «функцию», когда мы применяем оператор typeof к литералам регулярных выражений. Однако сегодня это не должно быть проблемой.

Исключения

Typeof document.all всегда возвращает undefined, даже если он определен во всех браузерах.

Оператор instanceof

Оператор instanceof проверяет, появляется ли свойство прототипа конструктора где-либо в цепочке прототипов объекта.

Это означает, что мы можем использовать его, чтобы проверить, является ли объект конструктором из данного класса или функции-конструктора.

Он возвращает true, если объект является экземпляром класса или функции-конструктора, и false в противном случае.

Например, если у нас есть:

class Foo <>; let foo = new Foo(); console.log(foo instanceof Foo); function Bar ()<>; let bar = new Bar(); console.log(bar instanceof Bar);

В терминале будет два «true».

Все, что создано с помощью new, можно проверить с помощью оператора instanceof.

Instanceof полезен для проверки всего, что создано с помощью оператора new, включая строки, логические значения и числа.

Например, если у нас есть:

let foo = new String('foo'); console.log(typeof foo); console.log(foo instanceof String);

Затем мы получаем ‘object’ из первого console.log и true для второго.

Это связано с тем, что мы создали экземпляр объекта String вместо строки примитивного значения, хотя в противном случае мы можем использовать примитивную строку и строковые объекты таким же образом.

Литеральные объекты

Литералы объектов, созданные без оператора new, являются экземплярами Object.

Итак, если у нас есть:

console.log(<> instanceof Object);

Все объекты являются экземплярами Object в дополнение к тому, что они являются экземплярами конструктора, из которого они созданы. Например, если у нас есть:

let date = new Date(); console.log(date instanceof Object); console.log(date instanceof Date);

В обоих случаях выведутся значение true, поскольку date является экземпляром конструктора Date, а все непримитивные объекты являются экземплярами Object.

Выводы

Оператор typeof и instanceof совершенно разные. typeof возвращает тип объекта, над которым он работает.

Instanceof of возвращает true, если объект создан из данного конструктора, и false в противном случае.

Все непримитивные объекты являются экземплярами Object, поэтому он всегда будет возвращать true.

instanceof

Оператор instanceof используется для проверки, принадлежит ли объект данному типу. Например, при поимке исключения нужно обработать только исключение определенного типа.

В левой части оператора instanceof указывается проверяемый объект, а с правой — функция-конструктор для проверки.

var theDay = new Date(2009, 11, 17); if (theDay instanceof Date) < alert("Объект класса Date") // . >

Оператор instanceof учитывает наследование.

Следующий пример демонстрирует, что объекты String и Date принадлежат типу Object.

Пример: проверка унаследованных объектов

var myString = new String() var myDate = new Date() myString instanceof String // true myString instanceof Object // true myString instanceof Date // false myDate instanceof Date // true myDate instanceof Object // true myDate instanceof String // false

То же верно и для типов, объявленных пользователем.

Например, в следующем примере объект типа Honda также принадлежит Car и Object .

function Car(model) < this.model = model >function Honda(model) < this.model = model this.isHonda = true >Honda.prototype = new Car() honda = new Honda("Accord") honda instanceof Honda // true honda instanceof Car // **true** honda instanceof Object // true honda instanceof Date // false

См. также

  • Выражения /Стандарт языка/

Автор: OneMan (не зарегистрирован), дата: 10 июня, 2010 — 19:50

instanceof можно использовать для проверки того, что переменная является массивом:

function is_array (a)
Автор: ixth, дата: 16 сентября, 2010 — 17:06

У вас вот тут вот очепятка: myString instanceof Objec // true

Автор: Lexi, дата: 25 сентября, 2010 — 21:13

Следовало бы упомянуть про особенности работы с фреймами.

Автор: vtk (не зарегистрирован), дата: 27 октября, 2011 — 09:06

ух ты. а я всегда думал что для такого наследования

Honda.prototype = new Car()

нужно еще указывать конструктор:

Honda.prototypу.constructor = Honda

а оно и так всё работает.

Автор: Mips, дата: 31 августа, 2013 — 12:43

Для проверка типа переменной используйте

function typeOf(value)
Автор: Гость (не зарегистрирован), дата: 29 октября, 2017 — 09:50

да, только Вы забыли toLowerCase():
function typeOf(value)

Автор: andypop, дата: 7 марта, 2014 — 10:41

instanceof можно использовать для определения типа поля объекта, сравните

o=; var m=o.pl; b=m instanceof Array; console.log(b);//true b=typeof m; console.log(""+b)//Object

Автор: Гость (не зарегистрирован), дата: 7 марта, 2016 — 04:39

var s = '1'; (instanceof s)

даёт false .
s — это же объект класса String, имеющий прототип, т.е.
String.prototype.asBool = function () <. >
s.asBool() — это сработает.

Автор: Гость (не зарегистрирован), дата: 11 декабря, 2017 — 10:15

I have a question about this example:

function is_array (a)

Can I check the «a instanceof Array» only?
What for this verify: typeof a == «object»??

Заранее спасибо за ответ)

Отправить комментарий

  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
Поиск по сайту

Учебник javascript

  • Введение
  • Основы javascript
  • DOM: работа с HTML-страницей
  • События
  • Объекты, ООП
  • AJAX
  • Особенности регулярных выражений в Javascript

Основные элементы языка

  • Базовые типы: Строки, Числа, Boolean
  • Операторы, их особенности в JS
  • Массивы
  • Функции
  • Замыкания
  • Регулярные выражения
  • Конструкции языка. Обработка ошибок.

Сундучок с инструментами

  • Редактирование и отладка скриптов
  • Cookie
  • HTTP-Отладка
  • Просмотр живого HTML
  • Разное полезное

Интерфейсы

  • Drag and drop
  • Грамотное javascript-дерево за 7 шагов
  • Интеграция AJAX в интерфейс
  • Координаты элемента на странице
  • Правильные show/hide/toggle
  • Удобное дерево с AJAX-подгрузкой

Все об AJAX

  • Введение в Ajax
  • Ajax и Rich Client
  • Ajax и клиент-серверная архитектура.
  • Способы общения с сервером
  • COMET
  • Форматы данных для AJAX
  • Обмен данными для документов с разных доменов
  • Обмен данными между доменами. Часть 2.

Оптимизация

  • Google Closure Compiler в деталях
  • Yahoo: лучшие способы ускорения сайта
  • Анализ оптимизации страниц c Yslow
  • Интерфейсы. Прочь от MVC
  • Оптимизация Javascript-кода
  • Польза от documentFragment
  • Сжатие Javascript и CSS
  • Улучшаем сжимаемость Javascript-кода.
  • Умное Кеширование и Версионность в Javascript/CSS

Разное

  • Асинхронное программирование
  • Google Gears в деталях
  • Javascript Flash мост
  • Букмарклеты и правила их написания
  • О подборке книг на сайте
  • Почему — плохо
  • Способы идентификации в интернете
  • Уровни DOM
  • Что почитать?
  • Шаблонизация с javascript
  • Юнит-тесты уровня браузера на связке Selenium + PHP.
  • Справочники: Javascript/HTML/CSS
  • Система сборки и зависимостей Google Closure Library
  • Хранение данных на клиенте. DOM Storage и его аналоги.
  • 10 лучших функций на JavaScript
  • สล็อต แตก หนัก แตก ง่าย.
    8 минут 48 секунд назад
  • สล็อต แตก หนัก แตก ง่าย.
    9 минут 27 секунд назад
  • thank you for your interesting.
    2 часа 2 минуты назад
  • this is really nice to read.
    2 часа 19 минут назад
  • Paypal Login money transfer fees: Type.
    2 часа 38 минут назад
  • I am really inspired with your writing.
    3 часа 7 минут назад
  • Я так понимаю ссылкой prototype (или ).
    3 часа 47 минут назад
  • wonka bar
    3 часа 51 минута назад
  • wonka bar
    3 часа 55 минут назад
  • สล็อต แตก ง่าย แจก หนัก.
    4 часа 7 минут назад
  • Почему при сортировке удаляются формулы?
  • Перевод страниц на лету
  • Меню — открывался только один пункт раскрывающего .
  • Мой новый проект
  • Где в формуле ошибка?
  • Нужно чтобы при выборе пункта селектора «Другое» .
  • Снова Новый год.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *