2016-10-11 2 views
1

Борьба, чтобы найти документацию по этому вопросу. Ранее я разработал класс в JavaScript-то вроде этого:JavaScript-класс/конструктор против определения как функции

class Polygon { 
    constructor(height, width) { 
    this.height = height; 
    this.width = width; 
    } 
    area = function() { 
    return this.height * this.width; 
    } 
} 

Он не работал на JSFiddle и я был кто-то сказать мне, что мне нужно сделать это следующим образом:

var Polygon = function(height, width) { 
    this.height = height; 
    this.width = width; 
    this.area = function() { return this.height * this.width; } 
} 

Я видел есть несколько способов сделать это, мне было интересно, похоже ли это на C++, где вы можете ... Polygon * myPoly = new Polygon (3, 4); сделать указатель, в отличие от Polygon myPoly (3, 4); или если это просто стилистика, и если да, то какое-то представление о том, почему один из них не работает на JSFiddle, а другой делает.

+1

Ваш вопрос с указателем на самом деле не применим к JavaScript. Все объекты памяти передаются по ссылке, а функции могут быть переданы в качестве параметров как указатели. – Paul

ответ

3

Ваш первый пример недопустим синтаксисом. Правильный способ написать это будет:

class Polygon { 
    constructor(height, width) { 
    this.height = height; 
    this.width = width; 
    } 
    area() { 
    return this.height * this.width; 
    } 
} 

Это должно работать в JSFiddle, если вы используете браузер, который поддерживает классы, но есть некоторые браузеры, которые там до сих пор нет (об этом ниже).

Что касается разницы между двумя способами его написания, происходит две вещи.

Во-первых, JavaScript - это очень гибкий язык, и, как правило, существуют десятки способов добиться того, что вы пытаетесь сделать.

Во-вторых, синтаксис class - это совершенно новая функция JavaScript, которая не полностью поддерживается во всех широко используемых браузерах (в частности, для всех версий Internet Explorer). Под поверхностью class действительно является просто «синтаксическим сахаром» для создания конструктивных объектов способом, который показан во втором примере, поэтому конечный результат этих двух примеров кода будет более или менее одинаковым.

Так что, чтобы ответить на вашу аналогию с C++, нет, два приведенных вами примера кода на C++ делают очень разные вещи, в то время как эти два примера дают почти тот же результат. Для того, чтобы получить результат, который почти точно так же, вы можете либо изменить первый пример этого:

class Polygon { 
    constructor(height, width) { 
    this.height = height; 
    this.width = width; 
    this.area = function() { return this.height * this.width; }; 
    } 
} 

или вместо этого изменить второй пример этого:

var Polygon = function(height, width) { 
    this.height = height; 
    this.width = width; 
}; 

Polygon.prototype.area = function() { return this.height * this.width; }; 
+0

OHhhhhhh! ОК, так что это ключ, я запускал JSFiddle в IE и локальную копию в Chrome. Подтверждено, что это не проблема JSFiddle, также спасибо за синтаксическую коррекцию. Продолжайте, хотя, второй пример работает для меня, по какой-либо причине, чтобы помочь сделать метод модификации прототипа? –

+0

@JosephSchmidt Основным преимуществом использования прототипа является то, что он сохраняет память. Вам нужно иметь только одну копию функции в памяти, а назначение ее в конструкторе означает, что каждый объект имеет свою собственную копию функции. Это действительно имеет значение, если у вас будет большое количество этих объектов.Основной момент, который я хотел бы отметить, состоит в том, что если вы создаете «класс» и определяете метод «area», как это было в моем первом примере, то, что происходит на самом деле за кулисами, заключается в том, что он добавлен к прототипу, поэтому эквивалентный неклассовый код будет использовать прототипы. – JLRishe

1

Вам нужно изменить свой код из области вара = ... в

get area() { return this.height * this.width; } 

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

https://jsfiddle.net/dwahlin/o93Lm0rc/

+0

Кажется, что OP хочет метод, а не геттер. – Bergi

+0

@ Bergi Yup кажется таким образом, хотя метод из-за соглашения об именах. –

+0

Я еще не встречал «получить», хотя, я полагаю, это в основном геттер. Вы бы рекомендовали сделать его геттером? –

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