четверг, 11 сентября 2014 г.

Прототипирование в Javascript

valueOf - возвращается сам обьект, на котором вызван данный метод, смысл только для классов, которым мы переопределим этот метод и будем обьект предствлять как простое значение типа хеш.
constructor - что создало обьект. Например для строки: function String(){[native code]}, для обьекта {}: function Object(){[native code]}, или для кастомного класса: function MyClass(a, b){this.a = a; this.b = b;}
toLocaleString - для обьекта класса Date значения результата данного метода будут отличаться в зависимости под какую локаль настроен браузер клиента, а так обычно результат идентичен со следующей вункцией.
toString - функции представляются в виде строки сорцов, для этих обьектов это самое интересное применение.
isPrototypeOftrue если объект на котором вызывают этот метод является прямым прототипом параметра.
propertyIsEnumerable - true возвращает только на свойства определенные именно в этом обьекте, на свойства выше в цепочке прототипов возвращается false, если true - то это поле появится в for..in. Но почему тогда если добавить в прототип Array, то такие поля появятся в for..in?
hasOwnPropertytrue если свойство принадлежит именно самому объекту, а не одному из прототипов по цепочке. Я так понимаю с предыдущим методом есть оличие в том, что некоторые поля прототипов ответятся как тру в предыдущем методе.

Пример использование методом Object

Object.prototype.findOwnerOfProperty = function(propName){
  var currentObject = this;
  while(currentObject !== null) {
    if (currentObject.hasOwnProperty(propName)) {
      return currentObject;
    } else {
      currentObject = currentObject.__proto__;
    }
  }
  return "No property found!";
}

Можно ставить прототипом и не класс, а обьект:
  var shoe = { size: 6, gender: "women", construction: "slipper"};
  
  var magicShoe = Object.create(shoe);
  magicShoe.jewels = "ruby";
  magicShoe.travelAction = "click heels";
  magicShoe.actionRequired = 3;

  shoe.isPrototypeOf(magicShoe);//true
  

Этот новый метод криэйт в последнийх реализациях JS позволил упростить старый добрый метод наследования.
Допустим у нас есть два класса:
function Animal(name) {
    this.name = name
    this.canWalk = true
}
Animal.prototype = {
    live: function(){}
};

function Rabbit(name) {
    this.name = name
}

Старый метод:
function extend(Child, Parent) {
    var F = function() { };
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.superclass = Parent.prototype;
}

extend(Animal, Rabbit);

Новый метод:

Rabbit.prototype = Object.create(Parent.prototype);

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

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