2016-07-02 2 views
2

Я хочу, чтобы все функции jQuery's DOM выполнялись для класса js, но эти функции имеют дело только с одним свойством этого класса.Оберните все функции jQuery в класс

class Foo { 
    constructor() { 
    this.$wrapper = $('<div>wrapper</div>') 
    } 
} 

var f = new Foo(); 

// have to call this 
f.$wrapper.appendTo($('body')); 
// want to call this 
f.appendTo($('body')); 

Я мог бы сделать это вручную, что бы эоны, создавая одноименный метод для каждого метода JQuery и просто всегда применять его в this.$wrapper. Но мне интересно, есть ли более простой способ сделать это.

https://jsfiddle.net/gy9tLyk2/

+0

Является ли это на стороне клиента сценариев? Если это так, 'class' не будет поддерживаться в нескольких основных браузерах, потому что это из ECMAScript 6. – 4castle

+2

Этот sorta поражает всю суть того, что вы делаете? Если вы все равно хотите вызвать 'f.appendTo' непосредственно, просто выполните' var f = $ (...) 'и отбросьте класс, так как вам нужно было бы установить' f' равным обтекаемому элементу jQuery, возвращенному в любом случае. – adeneo

+0

Прочтите некоторые примеры OOJS (объектно-ориентированный javascript) –

ответ

1

Да, просто расширить jQuery.fn.init и использовать super вызова:

class Foo extends jQuery.fn.init { 
 
    constructor() { 
 
    super('<div>wrapper</div>'); 
 
    } 
 
} 
 
Foo.prototype.constructor = jQuery; 
 
new Foo().appendTo('body');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Примечание заменяет Foo.prototype.constructor потому что JQuery будет иметь доступ к constructor свойствам экземпляра и вызвать его. Но классы ES6, такие как Foo, не подлежат вызову, и jQuery не должен звонить Foo.

Не уверен, что если столпотворение сможет правильно transpile, вот код ES5:

function Foo() { 
 
    this.init('<div>wrapper</div>'); 
 
} 
 
Foo.prototype = Object.create(jQuery.fn); 
 
new Foo().appendTo('body');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1

Одним из вариантов является использование ES2015 прокси, т.е. Proxy конструктора.

class Foo { 
    constructor() { 
    this.$wrapper = $('<div>wrapper</div>'); 
    return new Proxy(this, { 
     get: function(target, prop, receiver) { 
     if (target.hasOwnProperty(prop)) { 
      return target[prop]; 
     } 
     return function() { 
      let ret = target.$wrapper[prop](...arguments); 
      if (ret !== target.$wrapper) return ret; 
      return receiver; 
     } 
     } 
    }); 
    } 
} 

var f = new Foo(); 
var a = f.appendTo($('body')).text('changed').prop('tagName'); 

Но это не рекомендуется по нескольким причинам:

  1. Поддержка браузера
  2. Доверенные медленно
  3. JQuery имеет методы получения и установки и создания обработчика прокси, чем обрабатывает все JQuery и класс методы могут быть сложными.
+0

Прокси трудно понять. Это по сути клонирование объекта и переопределение одного из его свойств? – Tester232323

+0

@ Tester232323 Нет, он не клонирует объект, он обертывает объект и управляет _behavior_ его. Также как магические методы PHP. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy – undefined

Смежные вопросы