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:13
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Ruslan_xDD, isPlainObject (1.12.4 / 2.2.4)
Ответить с цитированием
  #3 (permalink)  
Старый 31.05.2016, 20:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Ruslan_xDD,
а просто нельзя ?
variable.constructor === Object
Ответить с цитированием
  #4 (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
Ответить с цитированием
  #5 (permalink)  
Старый 31.05.2016, 20:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

с фреймами работать не будет
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (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]';
}


Во.
Ответить с цитированием
  #7 (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));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (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]".
Ответить с цитированием
  #9 (permalink)  
Старый 04.06.2016, 17:58
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

pureJS, ну и что что выдает [object Object] создан то не так:
Сообщение от Ruslan_xDD Посмотреть сообщение
Т.е. только на такие:
var obj = {};
var obj2 = new Object;
...почувствуй разницу:
Сообщение от nerv_ Посмотреть сообщение
class Foo {}
let bar = new Foo();
...только не спрашивай в чем разница васёк...
Ответить с цитированием
  #10 (permalink)  
Старый 05.06.2016, 15:46
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от nerv_
alert(Object.getPrototypeOf({}) === Object.prototype)
имхо, единственно возможное решение, причем "решение влоб", поскольку если перефразировать задачу, то как раз и нужно проверить, что у объекта прототип совпадает с Object.prototype, только этим "чистые" объекты отличаются от всех остальных
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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