1

Тема: JS: работа св-ва prototype

Помогите разобраться с prototype... никак не пойму как это работает. Написал такой код для проверки:

Object.prototype.prop = "test";                // опред. некоторое свойство в прототипе Object


var a = new Array(), b = new Enumerator(), c = new Object(), d = new Date(), e = 25, f = "test", g = true, h;
var myArr = [a, b, c, d, e, f, g, h];

for(k=0; k<myArr.length; k++)
    {
    try
        {
        myArr[k].prop;
        WScript.Echo("Тип объекта:  " + typeof(myArr[k]) + "\nЗначение св-ва prop:  " + myArr[k].prop);
        }
    catch(err)
        {
        WScript.Echo("Тип объекта:  " + typeof(myArr[k]) + "\nЗначение св-ва prop НЕ ОПРЕДЕЛЕНО");
        }
    }

ожидал, что значение св-ва с именем prop будет прочитано для объектов, которые имеют тип Object,
а для объектов типа string, number и прочих оно не будет определено, но как оказалось не определено
только для переменной h, которая объявлена, но никакого конкретного значения (и сотв. типа) не имеет.
на что ссылается Object.prototype в данном примере?
как происходит, что JS при попытке прочитать св-во prop у числа (переменная e) берёт его из прототипа
для Object?

2

Re: JS: работа св-ва prototype

im2002 пишет:

... как происходит, что JS при попытке прочитать св-во prop у числа (переменная e) берёт его из прототипа для Object?

Попытаюсь ответить выдержкой из файла справки Script56.CHM:

Intrinsic Objects (JScript 5.6)
Microsoft JScript provides eleven intrinsic (or "built-in") objects. They are the Array, Boolean, Date, Function, Global, Math, Number, Object, RegExp, Error, and String objects. Each of the intrinsic objects has associated methods and properties that are described in detail in the language reference. Certain objects are also described in this section. ...

Перечислены встроенные объекты языка, среди них есть объект Number, и его безымянное свойство содержит элементарное значение Number. В Вашем случае при обращении к его свойству prop, оно доступно, как объявленное в прототипе любого объекта. Короче, в JScript любая сущность - есть объект, а, например, для Number это следует из спецификации ECMA Script, пункт 4.3.21 Объект Number.

im2002 пишет:

... но как оказалось не определено только для переменной h, которая объявлена, но никакого конкретного значения (и сотв. типа) не имеет. ...

В том же файле справки в Data Types (JScript 5.6) указано, что кроме типа Object есть еще и специальный тип Undefined, содержащий всегда одно элементарное значение Undefined, естественно, прототип объекта никак на него не влияет.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

3

Re: JS: работа св-ва prototype

Чуть-чуть общих слов, которые описаны на всех ресурсах, посвяженных JavaScript. Это прототипно-ориентированный язык.

Это значит, что все объекты наследуют свойства родителя через прототип. Изменяя набор свойств и значений в родительском прототипе вы изменяете эти свойства во всех (!!!) наследуемых экземплярах.

Object - базовый объект для всех объектов. Типы Number, String, Boolean, String, Array и прочие - производные от Object. Поэтому, меняя что-то в его прототипе вы вносите изменения во все (!!!) объекты своего проекта.

Общепринятое правило: не следует что-то писать в прототип стандартных типов без особой надобности. Некоторые библиотеки это делают, но в этом есть необходимость, например, восполнить отсутствующий функционал.

Попробуйте следующий пример. Я специально установил новое свойство в прототип Object, чтобы показать как оно появляется во всех переменных наследуемых типов.



Object.prototype.prop = 'Hello, world!';

function show(v)
{
    WScript.Echo('====');
    WScript.Echo(( typeof v ) + ' : ' + v);
    WScript.Echo(v.prop);
};

var bool = false;
show(bool);

var str = 'I am JS string';
show(str);

var number = 42;
show(number);

var obj1 = {};
show(obj1);

var obj2 = { prop: 'Surprise!!!' };
show(obj2);
( 2 * b ) || ! ( 2 * b )