Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.05.2016, 19:51
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Проверка на Object
Как лучше всего проверить переменную на "чистый" Object?

typeof variable == 'object' выдаст на любом объекте/прототипе и т.д.
variable instanceof Object также как и выше, но ещё и на ф-ции.

Как лучше всего проверить объект именно на "чистый" Object?

Т.е. только на такие:

var obj = {};
var obj2 = new Object;


Звучит, наверное, бредово. Мне это нужно для строгой типизации, чтобы не могли в метод передать левый объект с "чужого" прототипа и т.д.

Вот такие решения появились в голове:

variable instanceof Object && variable.__proto__.__proto__ == null

//или

variable instanceof Object && variable.__proto__.constructor == Object

Последний раз редактировалось ruslan_mart, 31.05.2016 в 19:53.
Ответить с цитированием
  #2 (permalink)  
Старый 31.05.2016, 20:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Ruslan_xDD,
а просто нельзя ?
variable.constructor === Object
Ответить с цитированием
  #3 (permalink)  
Старый 31.05.2016, 20:29
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

рони, ага, так и сделаю

isNativeObject: function(object) {
	return object instanceof Object && object.constructor === Object;
}


Хотя нет!

var a = {constructor: alert};
console.log(a.constructor === Object); //false
Ответить с цитированием
  #4 (permalink)  
Старый 31.05.2016, 20:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

alert(Object.getPrototypeOf({}) === Object.prototype)

с фреймами работать не будет
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 31.05.2016, 23:52
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

isNativeObject: function(object) {
    return Object.prototype.toString.call(object) === '[object Object]';
}


Во.
Ответить с цитированием
  #6 (permalink)  
Старый 01.06.2016, 09:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Ruslan_xDD
Во
нет
class Foo {}

let bar = new Foo();

alert(Object.prototype.toString.call(bar));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 04.06.2016, 16:09
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от Ruslan_xDD
Код:
isNativeObject: function(object) {
    return Object.prototype.toString.call(object) === '[object Object]';
}
Ruslan_xDD, тоже самое хотел предложить. Наилучшее решение!

Сообщение от nerv_
нет
Код:
class Foo {}
let bar = new Foo();
alert(Object.prototype.toString.call(bar));
nerv_, что нет? Всё правильно там, вроде бы. У меня выдаёт "[object Object]".
Ответить с цитированием
  #8 (permalink)  
Старый 05.06.2016, 15:46
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от nerv_
alert(Object.getPrototypeOf({}) === Object.prototype)
имхо, единственно возможное решение, причем "решение влоб", поскольку если перефразировать задачу, то как раз и нужно проверить, что у объекта прототип совпадает с Object.prototype, только этим "чистые" объекты отличаются от всех остальных
Ответить с цитированием
  #9 (permalink)  
Старый 05.06.2016, 17:23
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Rise,
Сообщение от Rise Посмотреть сообщение
...только не спрашивай в чем разница васёк...
Кто-то нахватался вершков, а про корешки совсем забыл, Советую наверстать упущенное - ссылки:Эти 2 книги выпущены Netscape - создателями Javascript. Очень советую прочитать! Глядишь и перестанешь считать себя царём васьков! ;-)

Сообщение от developer.mozilla.org
Классы в JavaScript появятся в ECMAScript 6 и будут представлять собой синтаксический сахар существующих в языке прототипных наследований. Синтаксис класса не вводит новую объектно-ориентированную модель наследования. Классы в JS предоставляют гораздо более простой и понятный способ создания объектов.

Определение классов
На самом деле классы — это функции. Поэтому так же, как вы определяете функции (function expressions и function declarations), вы можете определять и классы с помощью: class expressions и class declarations.

Источник: JavaScript-Reference, developer.mozilla.org
Для справки: слово "синтаксис" в переводе на русский язык означает словопостроение / словосочиненье.

Таким образом новые классы в JS - это не более чем более простой и понятный способ создания объектов через определение слова "class".

С таким же успехом можно утверждать, что и объекты, созданные таким образом:
Код:
function Clasz(name)
{
	this.name = name
}
var myObj = new Clasz('Вася');
тоже не подходят для такой проверки, поскольку также создаются через Function.

Новые классы, конечно, имеют множество отличий, но они всё также являются объектами в JS.

Также советую тебе прочитать правила этого форума, подумать о вежливости и о том, что "что посеешь, то и пожнёшь".
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax запрос к Wcf сервису возвращает Object Object Itogoo333 Общие вопросы Javascript 6 13.01.2016 03:02
проверка формы не работает в ie begelme Javascript под браузер 6 13.08.2013 01:00
Борьба с Object.defineProperty в IE8 FINoM Оффтопик 46 04.09.2012 23:45
Тег object - как получить его document neon121 Events/DOM/Window 36 11.06.2012 19:57
Проверка форм: .ajax async tarya jQuery 2 05.05.2011 20:38