1

Тема: JS: проверка наличия свойств у встроенного объекта Object

известно, что у встроенного объекта Object есть 2 свойства: constructor и prototype. Решил проверить их методом hasOwnProperty...

var arr = ["constructor", "prototype"];
var lst ="";
for(i=0; i<arr.length; i++)
    {
    if(Object.hasOwnProperty(arr[i]) == true)
            {
            lst += "объект: \"Object\" имеет св-во с именем: " + arr[i] + "\n";
            }
        else
            {
            lst += "объект: \"Object\"  НЕ имеет св-во с именем: " + arr[i] + "\n";
            }
    }
WScript.Echo(lst);

результат даёт что св-ва с именем constructor у данного объекта нет?! Почему?
метод hasOwnProperty() должен проверять только наличие свойств или методов тоже?

2

Re: JS: проверка наличия свойств у встроенного объекта Object

im2002 пишет:

Результат даёт что св-ва с именем constructor у данного объекта нет?! Почему?

Свойства prototype и constructor являются фактически зарезервированными именами, синтаксическое определение которых соответствует свойству объекта, однако позволяющие выполнять смену поведения заданных объектов на основании манипуляции с элементами первого рода
Фактически более подробное описание предоставлено здесь http://msdn.microsoft.com/en-us/library … s.90).aspx, при этом в левой колонке Properties осуществляется включение некоторых аналогичных технических свойств

im2002 пишет:

Метод hasOwnProperty() должен проверять только наличие свойств или методов тоже?

Свойство не включает формального отличия от метода, поскольку в общем случае не имеет значения, какого вида ссылочный объект записан в ассоциированное свойство, в том числе и функциональный
Тем не менее имеет существенное значение, каким образом было создано определенное свойство объекта, и в зависимости от аттбирутов вроде DontEnum
Более того, полный ответ с примерами есть а этой странице http://msdn.microsoft.com/ru-ru/library … s.94).aspx

3

Re: JS: проверка наличия свойств у встроенного объекта Object

Встроенные свойства объектов имеют атрибут enumerable = false, то есть эти свойства не будет отображаться при переборе переборе в циклах for-in. Это справедлино для свойств constructor и prototype.
http://www.ecma-international.org/ecma- … c-15.2.3.1

hasOwnProperty ищет свойство данного объекта, игнорируя цепочку вызовов.
http://www.ecma-international.org/ecma- … c-15.2.4.5

Ваш пример в начале темы некорректен. constructor и property это свойства объектов. В Вашем примере "constructor" и "property" это обычные строковые константы, являющиеся элементами объекта-массива. Способ доступа к ним разный.

( 2 * b ) || ! ( 2 * b )

4

Re: JS: проверка наличия свойств у встроенного объекта Object

Rumata пишет:

Ваш пример в начале темы некорректен. constructor и property это свойства объектов. В Вашем примере "constructor" и "property" это обычные строковые константы, являющиеся элементами объекта-массива. Способ доступа к ним разный.

С этим согласиться не могу.

if(Object.hasOwnProperty("constructor") == true)
            {
            WScript.Echo("объект: \"Object\" имеет св-во с именем: \"constructor\"");
            }
        else
            {
              WScript.Echo("объект: \"Object\"  НЕ имеет св-во с именем: \"constructor\"");
            }
if(Object.hasOwnProperty("prototype") == true)
            {
            WScript.Echo("объект: \"Object\" имеет св-во с именем: \"prototype\"");
            }
        else
            {
              WScript.Echo("объект: \"Object\"  НЕ имеет св-во с именем: \"prototype\"");
            } 

Это даёт такой же результат... увы...
Если переписать:

if(Object.prototype.hasOwnProperty("constructor") == true)
            {
            WScript.Echo("объект: \"Object\" имеет св-во с именем: \"constructor\"");
            }
        else
            {
              WScript.Echo("объект: \"Object\"  НЕ имеет св-во с именем: \"constructor\"");
            }

тогда свойство присутствует... вот в этом и пытался разобраться...

5

Re: JS: проверка наличия свойств у встроенного объекта Object

Ага! Вон в чем дело. Ваш пример весьма запутанный, и я обратил внимание на очевидные моменты в Вашем вопросе.

Все очень просто


Object.hasOwnProperty('constructor') == false
Object.hasOwnProperty('prototype') == true

Свойство constructor функции Object унаследовано из прототипа. А hasOwnProperty не показывает свойства из прототипа и цепочки прототипов. А цикл for-in не перебирает свойства у которых сброшен атрибут enumerable.

Почитайте приведенные ссылки.

( 2 * b ) || ! ( 2 * b )

6

Re: JS: проверка наличия свойств у встроенного объекта Object

Rumata пишет:

Свойство constructor функции Object унаследовано из прототипа. А hasOwnProperty не показывает свойства из прототипа и цепочки прототипов.
Почитайте приведенные ссылки.

Что является прототипом для Object()?! Глобальный объект?! Не могу никак понять... почему так происходит...
Если  hasOwnProperty показывает св-ва/методы, опред. в самом объекте а не в прототипе/цепочки прототипов, то в таком объекте как Array определены методы, к примеру: shift, pop, splice, свойство length и т.п. Это же для самого Array определено, или для его непонятного прототипа? Пример показывает, что для самого Array эти методы не определены, т.к.

var propname = ['shift', 'pop', 'splice', 'length', 'join'];    
var str = "";                        
for (i=0; i<propname.length; i++)
    {
    if(Array.hasOwnProperty(propname[i]) == true)
        {
        str += "св-во с именем: " + propname[i] + " определено для объекта Array\n";
        }
    else
        {
        str += "св-во с именем: " + propname[i] + " НЕ определено для объекта Array\n";
        }
    }
WScript.Echo(str);  - покажет, что кроме length ничего не присутствует

Однако, если заменить строку на

Array.prototype.hasOwnProperty(propname[i]) == true

,
то все св-ва как бы "обнаруживаются". Что такое прототип объекта Array? Почему все св-ва, как в примерах выше определены для него (прототипа)?
Думал может на реальном экземпляре объекта типа Array будет иначе выглятеть... брал вместо встроенного Array экземпляр:

myArr = new Array();

-  "те же яйца"...