65.9K
CodeProject 正在变化。 阅读更多。
Home

JavaScript中用户友好的对象模型

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (5投票s)

2013 年 9 月 17 日

CPOL

1分钟阅读

viewsIcon

18161

JavaScript 中用户友好的对象模型

引言

对于初学者来说,理解 JavaScript 中的对象模型和继承原则并不容易。 我将尝试帮助你:要描述一个类,需要描述类构造函数(它只是一个简单的函数)。类方法和继承通过原型来描述。隐藏的方法和属性通过闭包实现。

但我觉得这种方式不太方便。 我将向你介绍一种更简单的方法。 让我们创建项目

<!DOCTYPE HTML>
<html>
<head>
   <title>Sample project</title>
   <!-- Styles -->
   <link rel="stylesheet" type="text/css" href="http://a-web.me/styles/default/a-web.css" >
   <!-- Scripts -->
   <script type="text/javascript" src="http://a-web.me/scripts/a-web.js"></script>
</head>
<body>
   <script type="text/javascript">
       /**
         * Entry point
         */
       function main() {
       }
   </script>
</body>
</html> 

主函数将在页面加载后自动调用。 在我们的示例中,HTML 代码没有改变,因此我只编写 JavaScript 代码。 让我们创建一个类 TMyClass

/**
  * My class
  */
var TMyClass = AWeb.class({
    public : {
      /**
        * Constructor
        */
      constructor : function() {
         alert( "MyClass constructor" );
      }
   }
});

/**
  * Entry point
  */
function main() {
   var myClass = new TMyClass();
}

让我们添加 private 变量 "name" 和 public 方法 "getName"

/**
  * My class
  */
var TMyClass = AWeb.class({
    public : {
      /**
        * Constructor
        */
      constructor : function( initValue ) {
         this.name = initValue||"A-class";
      },
      
      /**
        * Returns name
        */
      getName : function() {
         return this.name;
      }
   }
});

我需要指出的是,"name" 变量仅在类 TMyClass 中可用。 调用 "myClass.name" 将返回 undefined 值。 但是调用 "myClass.getName()" 将返回 "A-class" 值。

让我们创建一个继承类

/**
  * My class
  */
var TMyInhClass = AWeb.class({
    extends : TMyClass,
    public : {
      /**
        * Constructor
        */
      constructor : function() {
         this.super( "B-class" );
      }
   }
});

继承类可以访问父类的所有 publicprotected 方法。 这里有一个调用示例

/**
  * Entry point
  */
function main() {
   var myClass = new TMyClass(),
       myInhClass = new TMyInhClass();
       
   alert(
      "myClass.getName() = " + myClass.getName() + "\n" +
      "myInhClass.getName() = " + myInhClass.getName() + "\n\n" +
      
      "myClass.name = " + myClass.name + "\n" +
      "myInhClass.name() = " + myInhClass.name
   );
} 

完整的代码如下所示

<!DOCTYPE HTML>

<html>
<head>
   <title>Sample project</title>
   <!-- Styles -->
   <link rel="stylesheet" type="text/css" href="http://a-web.me/styles/default/a-web.css" >
   <!-- Scripts -->
   <script type="text/javascript" src="http://a-web.me/scripts/a-web.js"></script>
</head>
<body>
   <script type="text/javascript">
      /**
        * My class
        */
      var TMyClass = AWeb.class({
          public : {
            /**
              * Constructor
              */
            constructor : function( initValue ) {
               this.name = initValue||"A-class";
            },
            
            /**
              * Returns name
              */
            getName : function() {
               return this.name;
            }
         }
      });

      /**
        * My class
        */
      var TMyInhClass = AWeb.class({
          extends : TMyClass,
          public : {
            /**
              * Constructor
              */
            constructor : function() {
               this.super( "B-class" );
            }
         }
      });

      /**
        * Entry point
        */
      function main() {
         var myClass = new TMyClass(),
             myInhClass = new TMyInhClass();
             
         alert(
            "myClass.getName() = " + myClass.getName() + "\n" +
            "myInhClass.getName() = " + myInhClass.getName() + "\n\n" +
            
            "myClass.name = " + myClass.name + "\n" +
            "myInhClass.name() = " + myInhClass.name
         );
      }
   </script>
</body>
</html> 

非常简单。 我再次强调,private 方法和变量仅在类方法中可见。 示例使用了 AWeb Library

如果这篇文章对某人有所帮助,我将向你介绍类的属性。 我将在下一篇文章中给出 protected 方法和类接口的示例。 感谢阅读。

关于该库的其他文章

我决定链接这些文章,因为互联网上的信息不多

© . All rights reserved.