2016-07-08 2 views
12

Посмотрите, как х и у объявлены в конструкторе:Объявите класс ES6 свойство вне функции

class Point { 
    constructor(x, y) { 
    this.x = x; 
    this.y = y; 
    } 
    toString() { 
    return '(' + this.x + ', ' + this.y + ')'; 
    } 
} 

есть ли способ, чтобы объявить свойства вне функций, например:

class Point { 
    // Declare static class property here 
    // a: 22 
    constructor(x, y) { 
    this.x = x; 
    this.y = y; 
    } 
    toString() { 
    return '(' + this.x + ', ' + this.y + ')'; 
    } 
} 

Так что я хочу присвойте a 22, но я не уверен, могу ли я сделать это за пределами конструктора, но все еще внутри класса.

+1

Я думаю, что вы может использовать 'static get x() {return 5; } ', который заканчивается тем же, просто довольно многословным. – somethinghere

ответ

16

Инициализация свойств непосредственно на классе в ES6 - not possible, только m В настоящее время этады могут быть объявлены таким образом. В ES7 действуют те же правила.

Однако это предлагаемая функция, которая может возникнуть после ES7 (в настоящее время на этапе 3). Вот official proposal.

Кроме того, синтаксис это предложение предлагает slightly different (= вместо :):

class Point { 
    // Declare class property 
    a = 22 
    // Declare class static property 
    static b = 33 
} 

Если вы используете Бабель, вы можете использовать этап 3 настройки, чтобы включить эту функцию.

Here's a Babel REPL example


Другой способ сделать это в ES6, кроме как в конструкторе, чтобы сделать это после определения класса:

class Point { 
    // ... 
} 

// Declare class property 
Point.prototype.a = 22; 

// Declare class static property 
Point.b = 33; 

Вот good SO Thread погружение в эту тему некоторые дополнительные данные


Нет т.е:

Как Берги упоминаются в комментариях, предложенный синтаксис:

class Point { 
    // Declare class property 
    a = 22 
} 

просто синтаксический сахар, чтобы обеспечить ярлык для этого кода:

class Point { 
    constructor() { 
    this.a = 22; 
    } 
} 

Где оба этих операторы присваивают свойство экземпляру .

Однако, это не совсем то же самое, как и присвоение прототипу:

class Point { 
    constructor() { 
    this.a = 22; // this becomes a property directly on the instance 
    } 
} 

Point.prototype.b = 33; // this becomes a property on the prototype 

Оба будут по-прежнему будут доступны через экземпляр:

var point = new Point(); 
p.a // 22 
p.b // 33 

Но получение b потребует восходя прототип цепи, а a доступен прямо на объекте.

enter image description here

+0

Не могли бы вы просто использовать 'static get x() {}'? Просто интересуюсь. По сути, это одно и тоже? – somethinghere

+0

Ну, это не совсем тот же эффект, но может быть похожим. Вы можете использовать 'get' для получения постоянного значения или другого значения, объявленного в конструкторе, который не совпадает с объявлением значения, которое может быть напрямую получено/установлено – nem035

+1

Hmmm true. Хорошо, слава богу, это единственный синтаксический сахар, и мы всегда можем полагаться на отличное наследие js :) – somethinghere

1

@ nem035 является правильным, что он находится в стадии предложения.

Однако предложение nem035 является одним из способов достижения его как члена экземпляра класса.

// Объявляем статическое свойство класса здесь

Кажется, вы хотите объявить статический член. Если да, то JavaScript путь

class Point { 
    // ... 
} 
Point.a = '22'; 

То, как вы на самом деле ожидает может быть сделано в машинописном

class Point { 
    static a = 22; 
} 

Составленный выход будет таким же, как описано выше, например

Point.a = '22'; 
Смежные вопросы