2015-11-17 4 views
4

Использование стандартного ES5 У меня есть этот метод, который позволяет мне добавлять методы в цепи прототипов моей библиотеки (это позволяет расширить основной библиотеки, а также любые компоненты, которые прикреплены к библиотеке):Продление ES6 классов программно

library.extend = function(extendId, extendObj) { 
     //if it's an extension of the core library object... 
     if(extendId === 'library') { 
      library.prototype[extendObj.name] = extendObj.func; 
     } else { 
      library.component[extendId].prototype[extendObj.name] = extendObj; 
     } 
}; 

Usage будет:

/* create some new class */ 
var somecomponent = function() {} 
somecomponent.protoype.somemethod = function() {} 

/* extend the base libraries prototype chain with the new class*/ 
library.extend('library', somecomponent) 

в ES6 классах у нас есть прототипы, но они замаскированы синтаксис класса, и вы должны добавить методы в класс с помощью метода extends.

Из-за этого я не уверен, как я могу программно добавлять методы в классы es6, используя метод, аналогичный тому, что у меня выше.

+0

Не указывая, как вы используете этот код, очень сложно понять, что вы просите. Однако ... Как правило, классы ES2015 можно считать «нормальными» (ES5) функциями. – Amit

+1

вы сможете расширить прототип. класс - это не просто синтаксический сахар. – webduvet

+0

@ Amit Я добавил пример использования, хотя я думаю, что код говорит сам за себя ... он просто расширяет цепочку прототипов. –

ответ

2

В классах ES6 у нас есть прототипы, но они замаскированы синтаксис класса, и вы должны добавить методы в класс, используя ключевое слово extends.

Я не уверен, что вы подразумеваете под «маскировкой». Да, это другой синтаксис, но результат совершенно такой же: class создает функцию-конструктор с свойством .prototype. Поэтому, хотя синтаксис extends, конечно, приятнее писать, вы не можете использовать его программно. Обратите внимание, что extends используется для подкласса, а не для расширения существующих классов, поэтому он не соответствует вашим потребностям.

Я не уверен, как я могу программно добавлять методы классам ES6, используя метод, аналогичный тому, что у меня выше.

Просто продолжайте использовать именно тот метод, который у вас уже есть. Совершенно нормально делать миксины в этом стиле.

2

Я думаю, у вас есть путаница.

В ES5, функция, созданная с помощью function выражения или заявлениями является инстанциируемыми (т.е. конструкторов) и вызываемые:

function f() {} 
f();  // Function call 
new f(); // Constructor instantiation 

Затем ES6 позволяет создавать объекты, которые только вызываемые или только инстанциируемыми:

var f =() => {}; // Arrow function 
f();    // Function call 
new f();   // Error: f is not a constructor 

class f {};  // Class 
f();    // Error: Cannot call a class as a function 
new f();   // Constructor instantiation 

То есть классы ES6 - это просто объекты с внутренним методом [[Construct]] и свойство prototype. Вы можете рассматривать их точно как конструкторы ES5.

Так что использование было бы

class somecomponent { /* create some new class */ 
    somemethod() {} 
} 

/* extend the base libraries prototype chain with the new class*/ 
library.extend('library', somecomponent) 

где library.extend является текущей.

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