基于闭包的对象的效率问题

时间:2011-03-03 12:51:08

标签: javascript prototype closures

在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编写,因此不希望用户访问内部变量/方法。提前谢谢......

2 个答案:

答案 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);
    }
})();

(这将允许访问圆的半径值,但不允许你更改它,这就是为什么我认为你想要这个)