2015-04-29 4 views
1

Представьте, что у вас есть класс в JavaScript создан, как это было обычноКак создать класс, который расширяет функции

var Button = function(width){ 
    this.width; 
} 
var button = new button(13); 

А теперь я хочу, чтобы расширить его с помощью хороших ES6 классов

class ColorButton extends Button { 
    constructor(width, color){ 
     super(width); 
     this.color(color); 
    } 
} 

Есть ли способ заставить его работать?

+1

Вы специально хотите делать расширение с помощью синтаксиса ES6? Или вы просто хотите знать, как сделать расширение объекта в javascript вообще? –

+1

Проверьте этот источник: http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/ – ChadF

+1

Как только вы объявляете метод '.color()' где-то, да, это будет "Работа". Или что именно ваша проблема? – Bergi

ответ

1

Наконец-то я мог бы решить мою проблему сам. Чтобы сделать класс javascript, выполненный как расширяемая функция, необходимо явно установить конструктор в прототипе:

var Button = function(width){ 
    this.width = width; 
} 

// This is the key part 
Button.prototype = { 
    constructor: Button 
} 

class ColorButton extends Button {}; 
var subButton = new ColorButton(25); 

console.log(subButton.width); // 25, it works! 
+0

По крайней мере, если вы используете транспортер babel. Он должен работать с чистым ES6. – Bergi

+0

Я бы использовал 'Button.prototype.constructor: Button' вместо установки всего прототипа. Причина в том, что, если вы хотите, чтобы это решение было достаточно общим для использования другими, вы не хотите, чтобы функция 'Button' была свободной, чтобы иметь какой-либо прототип, который он хочет. – AlexStack

2

Это кажется work as expected in Babel REPL: (код был изменен, для примера)

var Button = function(width){ 
    this.width = width; 

    console.log(this.width); 
} 
var superButton = new Button(13); 

class ColorButton extends Button { 
    constructor(width, color){ 
     super(width); 
     this.color = color; 

     console.log(this.color); 
    } 
} 
var subButton = new ColorButton(25, "Red"); 
+0

Спасибо @Andrew, но 'super'call в конструкторе, кажется, не работает: http://bit.ly/1bXhYhg – marquex

+0

@marquex: Ваш супер класс должен иметь '.constructor'. Работает [если сделано правильно] (http://babeljs.io/repl/#?experimental=false&evaluate=true&loose=false&spec=false&playground=true&code=var%20Button=function (w) {% 0A% 09this.w = w% 0A % 09console.log (this.w)% 0A}% 0AButton.prototype.sayHi = функция() {% 0A% 09console.log ('Привет% 20' + this.w)% 0A}% 0Avar% 20superButton = новый% 20Button (13)% 0Aclass% 20ColorButton% 20extends% 20Button {% 0A% 09constructor (ш, с) {% 0A% 09% 09super (ш)% 0A% 09% 09this.c = C% 0A% 09% 09console.log (this.c)% 0A% 09}% 0A}% 0Avar% 20subButton = new% 20ColorButton (25,% 22Red% 22)% 0AsubButton.sayHi()) – Bergi

+0

@marquex Если вы проверите ссылку Babel REPL в ответе, будет видеть нижнюю часть экрана, вызов 'console.log()' выводит как 13, так и 25, поэтому супервызов работает как ожидалось; по крайней мере, с Babel :) –

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