Как организовать наследование во встроенных классах 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. Каким должна быть схема определения методов, чтобы функции вызывались по цепочке вверх в зависимости от наличия в прототипах своих ближайших родителей?
Для организации наследования во встроенных классах JavaScript таким образом, чтобы методы вызывались по цепочке вверх, можно воспользоваться механизмом наследования прототипов. В данном случае, если метод any() определяется для класса Array и не определен для класса Object, то при вызове [].any() будет вызываться метод из прототипа Array.
Пример кода, который позволит вызывать методы по цепочке вверх в зависимости от наличия в прототипах своих ближайших родителей:
// Определяем метод any() для класса Object Object.prototype.any = function(){ console.log("object.any"); return this; }; // Создаем прототип для класса Array, унаследованный от прототипа Object Array.prototype = Object.create(Object.prototype); // Определяем метод any() для класса Array Array.prototype.any = function(){ console.log("array.any"); return this; }; [].any(); // В этом случае будет вызван метод из прототипа Array
Таким образом, при вызове метода any() для массива будет вызываться метод из прототипа Array, а если метод не определен для класса Array, то будет вызван метод из прототипа Object.
Для организации наследования во встроенных классах JavaScript таким образом, чтобы методы вызывались по цепочке вверх, можно воспользоваться механизмом наследования прототипов. В данном случае, если метод any() определяется для класса Array и не определен для класса Object, то при вызове [].any() будет вызываться метод из прототипа Array.
Пример кода, который позволит вызывать методы по цепочке вверх в зависимости от наличия в прототипах своих ближайших родителей:
// Определяем метод any() для класса ObjectObject.prototype.any = function(){
console.log("object.any");
return this;
};
// Создаем прототип для класса Array, унаследованный от прототипа Object
Array.prototype = Object.create(Object.prototype);
// Определяем метод any() для класса Array
Array.prototype.any = function(){
console.log("array.any");
return this;
};
[].any(); // В этом случае будет вызван метод из прототипа Array
Таким образом, при вызове метода any() для массива будет вызываться метод из прототипа Array, а если метод не определен для класса Array, то будет вызван метод из прототипа Object.