原始问题被搁置,所以这是一个不同措辞的新尝试。我希望,它现在越来越清晰了:
问题:如何使用私有方法而不是使用原型执行以下操作?
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
,因为在真实的剧本中,计算需要很长时间。)。
答案 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