Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка на Object (https://javascript.ru/forum/misc/63324-proverka-na-object.html)

ruslan_mart 31.05.2016 19:51

Проверка на 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

Rise 31.05.2016 20:13

Ruslan_xDD, isPlainObject (1.12.4 / 2.2.4)

рони 31.05.2016 20:17

Ruslan_xDD,
а просто нельзя ?
variable.constructor === Object

ruslan_mart 31.05.2016 20:29

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

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


Хотя нет!

var a = {constructor: alert};
console.log(a.constructor === Object); //false

nerv_ 31.05.2016 20:54

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

с фреймами работать не будет

ruslan_mart 31.05.2016 23:52

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


Во.

nerv_ 01.06.2016 09:48

Цитата:

Сообщение от Ruslan_xDD
Во

нет
class Foo {}

let bar = new Foo();

alert(Object.prototype.toString.call(bar));

pureJS 04.06.2016 16:09

Цитата:

Сообщение от 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]".

Rise 04.06.2016 17:58

pureJS, ну и что что выдает [object Object] создан то не так:
Цитата:

Сообщение от Ruslan_xDD (Сообщение 418143)
Т.е. только на такие:
var obj = {};
var obj2 = new Object;

...почувствуй разницу:
Цитата:

Сообщение от nerv_ (Сообщение 418205)
class Foo {}
let bar = new Foo();

...только не спрашивай в чем разница васёк...

Яростный Меч 05.06.2016 15:46

Цитата:

Сообщение от nerv_
alert(Object.getPrototypeOf({}) === Object.prototype)

имхо, единственно возможное решение, причем "решение влоб", поскольку если перефразировать задачу, то как раз и нужно проверить, что у объекта прототип совпадает с Object.prototype, только этим "чистые" объекты отличаются от всех остальных


Часовой пояс GMT +3, время: 12:44.