Javascript:通过返回匿名对象实现私有变量

时间:2014-06-21 03:59:13

标签: javascript

此示例实现了矩形的私有变量。变量myLength和myWidth对于不同的实例是不同的。那么为什么不推荐这种方法呢?

var rectangle = function() {
    var myLength = 8;
    var myWidth = 6;

    var getMyLength = function () {
        return myLength;
    };

    var setMyLength = function (value) {
        myLength = value;
    };

    var getMyWidth = function () {
        return myWidth;
    };

    var setMyWidth = function (value) {
        myWidth = value;
    };

    var drawFigure = function() {
        console.log("Draw invoked for figure: " +
            getMyLength() + " * " + getMyWidth());
    };

    return {
        getMyLength: getMyLength,
        setMyLength: setMyLength,
        getMyWidth: getMyWidth,
        setMyWidth: setMyWidth,
        drawFigure: drawFigure
    }
};

然后我们按如下方式使用它:

var myRectangle = new rectangle();

myRectangle.drawFigure();           // Draw invoked for figure: 8 * 6

myRectangle.setMyLength(3);

myRectangle.setMyWidth(5);

myRectangle.drawFigure();           // Draw invoked for figure: 3 * 5

var myRectangle1 = new rectangle();

myRectangle1.drawFigure();          // Draw invoked for figure: 8 * 6

1 个答案:

答案 0 :(得分:2)

在我看来,私人变量被高估了。你真的需要隐藏程序员的东西吗?不会。即使您公开了所有私人变量,它会有什么不同?事实上,我主张公开一切,因为:

  1. 这将使调试更容易。如果你console.log一个对象,那么你可以检查它的公共属性,这使得调试更容易,因为你可以看到对象的状态。
  2. 您不需要创建不必要的闭包。如果您想要一个私有变量并且还希望它可以通过公共方法访问,那么您必须创建一个闭包(每个实例一个) 。如果您公开您的属性,那么您不需要关闭。您可以将方法放在原型上。因此,每个类只有一个方法,由所有实例共享。
  3. 您不需要创建不必要的getter和setter。将变量设为私有然后允许任何人使用getter和setter函数修改它有什么意义?你也可以将变量公之于众。

    以我的拙见,吸气剂和制定者只对幻像属性有用:

    var Person = defclass({
        constructor: function (firstName, lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        },
        getFullName: function () {
            return this.firstName + " " + this.lastName;
        },
        setFullName: function (fullName) {
            var name = fullName.split(" ");
            this.firstName = name[0];
            this.lastName = name[1];
        }
    });
    
  4. 因此,在我看来,您应该按照以下方式编写Rectangle课程:

    var Rectangle = defclass({
        constructor: function (width, height) {
            this.width = width;
            this.height = height;
        }
    });
    

    然后我们按如下方式使用它:

    var rectA = new Rectangle(8, 6);
    
    console.log(rectA);              // { width: 8, height: 6 }
    
    rectA.width  = 3;
    rectA.height = 5;
    
    console.log(rectA);              // { width: 3, height: 5 }
    
    var rectB = new Rectangle(8, 6);
    
    console.log(rectB);              // { width: 8, height: 6 }
    

    最后,defclass的定义:

    function defclass(prototype) {
        var constructor = prototype.constructor;
        constructor.prototype = prototype;
        return constructor;
    }
    

    所以这只是我在JavaScript中创建对象的两分钱。