@roskoshinsky

Как организовать наследование во встроенных классах JavaScript, чтобы методы вызывались по цепочке вверх?

Допустим метод any() определяется для встроенного класса Object и Array через свойство prototype:

Object.defineProperty(Object.prototype, "any", {
   value: function(){
      console.log("object.any");
      return this;
   } // function
   ,enumerable :false
});

Array.prototype.any = function(){
   console.log("array.any");
   return this;
}; // any

[].any();


Однако, при вызове [].any() вызывается метод any() определённый для класса Object. Каким должна быть схема определения методов, чтобы функции вызывались по цепочке вверх в зависимости от наличия в прототипах своих ближайших родителей?
  • Вопрос задан
  • 283 просмотра
Решения вопроса 1
@napa3um
Object.prototype.any = function() {
   console.log('object.any');
   return this;
};

Array.prototype.any = function() {
   console.log('array.any');
   return this;
};

// или -----------------------------------------------

Object.defineProperty(Object.prototype, 'any', {
   value: function() {
      console.log('object.any');
      return this;
   },
   enumerable: false,
   writable: true // for assigment operation (=) support
});

Array.prototype.any = function() {
   console.log('array.any');
   return this;
};

// или -----------------------------------------------

Object.defineProperty(Object.prototype, 'any', {
   value: function() {
      console.log('object.any');
      return this;
   },
   enumerable: false
});

Object.defineProperty(Array.prototype, 'any', {
   value: function() {
      console.log('array.any');
      return this;
   },
   enumerable: false
});

// ---------------------------------------------------

[].any(); // array.any
({}).any(); // object.any
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
abyrkov
@abyrkov
JavaScripter
Ручками никак?
Array.prototype.any.apply(this, arguments);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы