2015-07-03 3 views
-1

В Javascript возможно наследование с помощью функций-конструкторов и их атрибута «прототип» (т. Е. «Родительский элемент будущих экземпляров») или совсем недавно Object .create(), чтобы получить новые объекты.Сделать «функциональный объект» javascript наследуемым от другого

В последнее время мне нужно было «переопределить» объект JQuery («$») для одного из моих проектов, то есть предоставить аналогичную функцию, которая также имеет все функции fn/extend/... [inherited ] атрибутов оригинальной фабричной функции «jQuery».

Целью было иметь функцию «$()», которая всегда принимала «window.parent» как второй параметр по умолчанию, так что вся программа модифицировала родительский кадр, а не iframe, в котором была загружена программа ,

Обычно я ожидал, чтобы иметь возможность сделать что-то вроде этого:

var oldJQ = $; 
$ = function (selector) { 
    return oldJQ(selector, window.parent); 
} 
$.__proto__ = oldJQ .__proto__; 

$.extend({...}); // must work 

Несмотря на многочисленные попытки, я не мог заставить его работать, я всегда получал простые объекты вместо реальных функций при использовании «новый ", или наследование не работает. Я нашел альтернативные способы (например, путем копирования всех атрибутов из $ в мой новый объект функции), но мне кажется, что это ужасный способ делать вещи.

Есть ли способ создать новый объект функции, который имеет в качестве родительского/прототипа исходного $ объекта?

+3

Что вы делали? –

+0

«У меня всегда были простые объекты вместо реальных функций». Учтите, что 'function' не является фактическим типом данных. [Эти] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Data_types) являются единственными фактическими типами данных. Проясняет? –

+0

Нет, это невозможно. Объекты могут иметь только один прототип, а вещи, унаследованные от 'Function', не подлежат вызову. Прокси ES6 могут помочь, но это не совсем то же самое. – Ryan

ответ

1

Хотя функции являются объектами в javascript, они не являются обычными объектами. В частности, это объекты, для которых наследование нарушено. Функции не являются единственными подобными объектами в языке, элементы DOM также имеют инвалидность. Это одна из причин, по которой jQuery реализуется как оболочка вокруг DOM, а не расширяет возможности DOM через наследование.

К счастью, в то время как ООП не работает в этом случае, мы можем вдохнуть вдохновение из самого jQuery и использовать FP для выполнения того, что нам нужно. Другими словами, хотя вы не можете наследовать функции, вы можете обернуть их другой функцией.

Например, если вам нужен специальный console.log функция для вашего приложения, которое отправляет журналы обратно на сервер вы можете изменить его, пересматривая его:

var log_orig = console.log; 
console.log = function() { 
    ajaxlog([].slice.call(arguments,0).map(function(x){ 
     return JSON.parse(x); 
    }).join(','); 
    log_orig.apply(console,arguments); 
} 

Или, если вы хотите специальную версию $, что делает что-то дополнительно:

function $$() { 
    /* 
    * do extra stuff 
    */ 
    return $.apply(null,arguments); 
} 

Или, если вы хотите, чтобы переопределить $ вместо если упаковка:

var old$ = $; 
function $() { 
    /* 
    * do extra stuff 
    */ 
    return old$.apply(null,arguments); 
} 
Смежные вопросы