Javascript:类构造函数基础 - 在单独的方法中定义属性

时间:2016-03-21 15:07:29

标签: javascript function class

原始问题被搁置,所以这是一个不同措辞的新尝试。我希望,它现在越来越清晰了:

问题:如何使用私有方法而不是使用原型执行以下操作?

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中使用{ {1}} - 不,我不能只重新计算checkIfPrime,因为在真实的剧本中,计算需要很长时间。)。

2 个答案:

答案 0 :(得分: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);
}

如果您不想将所有内容作为参数传递,您也可以使用call()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);
}

答案 1 :(得分: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;
})();

这样那些函数只是私有函数,可以随意使用。

技术上你不需要es6中的iife,但我只是假设你的所有代码都在一个文件中,如果不是那么你需要做的就是导出{{ 1}}和另一个函数将是私有的。)

或没有es6:

MyClass