在Javascript中定义类的一种方法是使用闭包和对象文字。例如,考虑一个圆圈:
var circle = function(radius) {
var radius = radius;
return {
area: function() {
return Math.PI*(radius*radius);
}
}
}
然后可以使用内部变量保持封装来实例化圆形对象:
c = circle(1);
c.area(); // Returns pi
c.radius; // Returns undefined
不幸的是,使用这种方法,如果我要创建多个圆圈,则会为每个实例复制区域功能。这是通常使用原型的地方:
var Circle = function(radius) {
this.radius = radius;
}
Circle.prototype.area = function() {
return Math.PI*(this.radius*this.radius);
};
现在的问题是变量不能被声明为私有:
c = new Circle(1);
c.area(); // Returns pi
c.radius; // Returns 1
有谁知道我会如何充分利用两者?效率是一个问题,所以宁愿避免第一种方法的当前制定,我正在为公共API编写,因此不希望用户访问内部变量/方法。提前谢谢......
答案 0 :(得分:1)
这个怎么样:
function Circle(radius) {
this.getRadius = function() { return radius; }
}
Circle.prototype.area = function() {
var r = this.getRadius();
return Math.PI * r * r;
};
现在Circle
伪类的每个实例都有两个方法:
area
继承自原型,因此使其成为公共方法getRadius
分配给实例对象,从而使其成为实例方法 radius
值仍然可以通过getRadius
检索。但是,如果getRadius
可以确定是否从Circle.prototype
方法中调用它并且只返回radius
值,那么这将解决它,但我不确定可以做到。
答案 1 :(得分:0)
这就是我提出的,尽管每次创建GetArea()方法是否“高效”我都怀疑,但这是我从原型方法访问本地范围变量的唯一方法:
var Circle = (function(){
var Circle = function(radius) {
this.GetRadius = function(){
return radius;
}
};
Circle.prototype.area = function() {
var rad = this.GetRadius();
return Math.PI*(rad*rad);
};
return function(radius){
return new Circle(radius);
}
})();
(这将允许访问圆的半径值,但不允许你更改它,这就是为什么我认为你想要这个)