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

рони 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]".

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

Цитата:

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

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

pureJS 05.06.2016 17:23

Rise,
Цитата:

Сообщение от Rise (Сообщение 418488)
...только не спрашивай в чем разница васёк...

Кто-то нахватался вершков, а про корешки совсем забыл, Советую наверстать упущенное - ссылки:Эти 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.

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


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