代码之家  ›  专栏  ›  技术社区  ›  Jasarien

Javascript封装

  •  5
  • Jasarien  · 技术社区  · 15 年前

    我对Javascript还很陌生,我的SO profile就证明了这一点。

    我刚刚阅读了一些教程,在使用Javascript时遇到了一些关于面向对象和封装方面我不完全理解的问题。

    var myCustomObject = new Object();
    

    你可以给它这样的实例变量:

    myCustomObject.myVariable = "some value";
    myCustomObject.myOtherVariable = "deadbeef";
    

    function CustomObject(myVariable, myOtherVariable)
    {
        this.myVariable = myVariable;
        this.myOtherVariable = myOtherVariable;
    }
    

    我还知道,您可以创建值并将值赋给尚不存在的变量,其结果是隐式声明的,如示例中所示,其中 myCustomObject 没有 myVariable ,但现在是了。

    所以,我的问题是:有什么可以防止在代码的其他点添加新变量。如果我试图了解一个对象是如何工作的,以及我可以/应该如何处理它,我可能永远不会看到变量的添加,而这些变量很可能存在于其他一些.js文件中,因此无法完全理解该对象。。。

    另外,我怎么知道一些刚刚创建的对象不会在以后的代码中突然添加60个变量,这些变量在创建时根本没有提到?

    如果“随意地”在一个对象中添加更多的内容,你怎么能一眼就理解它包含的内容呢?

    4 回复  |  直到 15 年前
        1
  •  1
  •   BGerrissen    15 年前

    Javascript对象是transformers(TM),它们可以从一种形式转换到另一种形式。

    在实践中,这种情况只发生在充实物体上,而不会造成伤害。例如,它允许升级现有的“类”,而不是子类化或重新修饰实例,从而消除创建更多“类”的需要。举个例子:

    var Vehicle = function(){}
    
    var factory = {
        create: function(name, props){
            var v = new Vehicle();
            v.type = name;
            for(var prop in props) {
                v[prop] = props[prop];
            }
        }
    }
    
    var bike = factory.create('Bike', {
        wheels: 2
    });
    
    var car = factory.create('Car', {
        wheels: 4,
        doors: 5,
        gear: 'automatic'
    });
    
    var plane = factory.create('Airplane', {
        wings: 2,
        engines: 4
    });
    

    想象一下,如果没有动态对象,上面的代码将执行什么操作,而您无法执行以下操作:

    // lets paint our car
    car.color = 'candy red';
    // bling!
    car.racingStripes = true;
    car.mirrorDice = true;
    car.furryChairs = true;
    

    你可以用更简单的方式丰富/个性化对象。

        2
  •  7
  •   Quentin    15 年前

    我不敢相信我会引用蜘蛛侠的话,但是

    有权必有责

    JavaScript功能强大、灵活,给程序员很大的自由。它并没有为阻止程序员编写错误代码而设计的功能。当您编写JavaScript时,您负责确保代码是好的,而不是语言。

        3
  •  2
  •   Onkelborg    15 年前

    你不能,没有什么能阻止我对你的对象做任何我想做的事;)但是,你不必使用这些变量。。

    您可以做的一件事是使用作用域,例如:

    function myConstructor()
    {
      var myState = {}; //Create new, empty object
      myState.text = "Hello World!";
      this.say = function() {
        alert(myState.text);
      };
    }
    

    在这个简单的示例中,您可以将内部变量存储在myState中(或“var text='';”等),但它们不能从外部访问,因为它们不是对象的成员,只是函数中的私有变量。而且,如您所见,函数say仍然可以访问它。

        4
  •  2
  •   Ollie Edwards    15 年前

    简而言之:完全没有。

    长答案:

    Javascript在很多方面都是一种动态语言,而不仅仅是类型系统。语言中所有类似对象的东西基本上都是一个可以随意添加的关联数组。变量(显然可以包含这些类似对象的东西)只存在于它们的函数范围内。

    您可以使用这一点来模拟私有成员,这可以在一定程度上缓和这种情况。我之前已经发布过好几次这样的例子,所以我将只向您介绍关于这个主题的权威指南: http://javascript.crockford.com/private.html .

    至于以一种你不想用的方式向对象添加新成员,实际上没有什么事情要做,这就是语言的方式。

    当接近javascript时,试着记住它并不是一种OOP语言,而是一种功能/原型与一些OOP思想的奇妙结合。不要被类似java的语法所愚弄,如果你发挥语言的优势而不是模仿java,你会有更好的时间。