2016-03-21 3 views
1

Оригинальный вопрос был приостановлен, так что вот новая попытка в другой формулировке. Я надеюсь, что теперь становится понятнее:Javascript: Основы конструктора классов - определение свойства по отдельному методу

Вопрос: Как я могу сделать следующее с помощью частных методов вместо использования прототипа?

function numberPlusFive(nr) { 
    this.number = number + 5; 
    this.square = this.calculateSquare(); 
    this.isPrime = this.checkIfPrime(); 
} 
numberPlusFive.prototype = { 
    calculateSquare: function() { 
     return this.number * this.number; 
    }, 
    checkIfPrime: function() { 
     // check if this.number is a prime number 
     return true; // or false 
    }, 
} 

Методы (calculateSquare, checkIfPrime) больше не нужны после создания класса. Я хочу сделать вычисления в отдельных методах, но мне не нужны методы, чтобы быть общедоступными.

Важно: мне нужны уже вычисленные свойства для дальнейших вычислений (поэтому в данном примере, this.numberдолжны быть доступны в calculateSquare и checkIfPrime - и нет, я не могу просто пересчитать this.number потому что в реальном сценарии, это требует много времени для расчета.).

+0

Так что это вопрос? – hindmost

+0

Вопрос: вам нужно 'calculateSquare & checkIfPrime' как общедоступные методы? –

+0

Нет, мне не нужно вычислятьSquare & checkIfPrime как общедоступные методы – am2124429

ответ

2

вы можете объявить calculateSquare и checkIfPrime функции в конструкторе и возвращать другой объект.

function myFirstJsClass(number) { 

    var calculateSquare = function(n) { 
     return n * n; 
    }; 

    var checkIfPrime = function(n) { 
     //check if prime 
     return true; // or false 
    }; 

    this.number = number; 
    this.square = calculateSquare(number); 
    this.isPrime = checkIfPrime(this.square); 

} 

В качестве альтернативы вы также можете объявить их снаружи и вызвать их в конструкторе.

var calculateSquare = function(n) { 
    return n * n; 
}; 

var checkIfPrime = function(n) { 
    //check if prime 
    return true; // or false 
}; 

function myFirstJsClass(number) { 
    this.number = number; 
    this.square = calculateSquare(number); 
    this.isPrime = checkIfPrime(this.square); 
} 

, если вы не хотите, чтобы передать все в качестве параметра вы можете также вызвать функцию с помощью вызова() http://www.w3schools.com/js/js_function_invocation.asp

var calculateSquare = function() { 
    this.square= this.number * this.number; 
}; 

var checkIfPrime = function() { 
    //check if prime with this.square 
    this.isPrime = true; // or false 
}; 

function myFirstJsClass(number) { 
    this.number = number; 
    calculateSquare.call(this); 
    checkIfPrime.call(this); 
} 
+0

Ваши примеры на самом деле не «классы» в любой форме, просто генераторы объектов. – Neal

+0

Я изменил свои фрагменты. Я думаю, что основной намек остается: он может определять функцию как переменные в конструкторе, так и внешне, и не полагаться на «это» свойство внутри двух функций. –

+0

Выглядит хорошо для меня :-) Спасибо за обновление – Neal

1

Используйте IIFE

var MyClass = (function() { 
    let calcSquare = number => number * number; 
    let isPrime = number => { /* your prime code */ }; 
    class MyClass { 
     constructor(number) { 
      this.square = calcSquare(number); 
      this.isPrime = isPrime(number); 
     } 
    } 

    return MyClass; 
})(); 

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

(технически вам не нужно iife в ES6, но я просто предположил, что весь код был в одном файле, если оно не то все, что вам нужно будет сделать, это просто экспортировать MyClass и другая функция будет быть частным)


или без ES6:.

var MyClass = (function() { 
    var calcSquare = function(number) { return number * number; }; 
    var isPrime = function(number) { /* your prime code */ }; 

    function MyClass(number) { 
     this.square = calcSquare(number); 
     this.isPrime = isPrime(number); 
    } 

    return MyClass; 
})(); 
+1

Если вы используете ES6 и 'class', почему бы вам обернуть это в IIFE, а не просто экспортировать класс, но не функции? – ssube

+0

ssube True :-) Но OP никогда не заявлял, что использует какие-либо модули, поэтому я просто предполагаю, что нет, но да, если это внешний файл, iife не нужен :-) – Neal

+0

Весь код находится в одном файле, это без проблем. Можете ли вы добавить пример использования этих классов? Я не вижу, как передать номер. И: я только что редактировал свои вопросы - мне нужно использовать результат calcSquare в моем основном коде. Возможно ли это в любом из двух предложений? – am2124429

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