воскресенье, 29 января 2012 г.

Нововведения в ECMAScript 5th Edition

Object.create
Object.create(proto [, propertiesObject ])
Cоздание обьекта и определение его прототипа:
var o = Object.create({
    param1: 3,
    method1: function(){...} 
});

Прибить обьекту hasOwnProperty можно так:
var o = Object.create(null);
console.log(o.hasOwnProperty);//null 
propertiesObject - а это вообще интересная штука! Это обьект в котором мы определяем именно собственные свойства. Только свойству нельзя просто указать значение, мы это обязаны сделать черз обьект с полем value, кроме того неявно указывается поля writable: false, enumerable: false, configurable: false. Что означет первое - понятно, а вот что 2 и 3 мне пока не понятно)
var o = Object.create({}, { p: { value: 42 } });
o.p = 24;
console.log(o.p);//O-o-oh 42!!!

o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
o.p = 24;
console.log(o.p);// 24 - о так привычней)
Ага написал этот пример, почитал дальше MDN, нашел что такое enumerable свойство поля. Так вот те у кого это свойство == тру, будут возвращены из обьекта o, методом Object.keys:
var ekeys = Object.keys(o);//enumerable own(not from its [[Prototype]]) properties
А методом Object.getOwnPropertyNames, мы получаем все свои свойства как enumerable, так и нет, но только не [[Prototype]]:
var keys = Object.getOwnPropertyNames(o);
А и кстати for..in в ECMAScript 5th Edition, возвращает все только свои enumerable арибуты и enumerable арибуты прототипа. Чтобы вернуть все атрибуты как свои, так и прототипа, то можно сделать так:
function listAllProperties(o){       
    var objectToInspect;       
    var result = [];  
      
    for(objectToInspect = o; objectToInspect !== null; objectToInspect = Object.getPrototypeOf(objectToInspect)){    
        result = result.concat(Object.getOwnPropertyNames(objectToInspect));    
    }  
      
    return result;   
}
Тут мы видим как всплывает еще один новый метод Object.getOwnPropertyNames. Кроме того, эта функция дает нам еще одну плюшку - мы можем увидеть все даже скрытые прототипные свойства(те которые перегружены свойствами в наследниках, потому что имеют такие же имена).

Function.prototype.bind

Комментариев нет:

Отправить комментарий