Javascript OOP:方法应该是可枚举的吗?

时间:2013-08-05 17:38:48

标签: javascript oop inheritance frameworks

我正在为JavaScript开发一个新的OOP模型,我想知道你是否认为在可枚举的对象上创建方法或仅在数据成员上创建方法是正确的。我可以在两者中看到一些意义,也许没有明确的答案。

也可以使自己的方法可枚举,而继承的方法则不...

即使它们被继承,我觉得无论如何都要使所有数据成员都是可枚举的。

更新:这似乎不清楚人们在回答什么。我正在创建一个OOP模型,允许用户写这样的东西来声明一个类:

更新2 :在项目结束的同时,这就是它:OoJs。其中,用户定义的属性(包括方法)是可枚举的,框架添加的属性不是。

;(function( namespace )
{
   'use strict';

       namespace.Shape = Shape
   var Static          = namespace.OoJs.setupClass( "Shape" )


   // Data members
   //
   Static.canvas = null


   Static.Protected( "canvas" )  // Protected members

   Static.Public   ()            // Public members


   // constructor
   //
   function Shape()
   {
      // Data members
      //
      this.sides = null

      // Private methods
      //
      this.init  = init


      this.Protected( "sides" )               // Protected members


      var iFace = this.Public( getOffset )    // Public interface


      this.init() // for example      


      return iFace
   }


   // Method definitions
   //
   function init     (){ /*do something useful*/   }
   function getOffset(){ return [ this.x, this.y ] }

})( window )

所以问题是你是否会使用它来声明你的类,你会假设/希望方法是否可枚举,或者是否应该有一种方法来配置全级或每个成员是否应该可以枚举?

2 个答案:

答案 0 :(得分:0)

除非有一些与键相关的语义 - 你鼓励你的对象的用户迭代它的属性 - 那么使方法可以枚举既不是优点也不是缺点。

隐藏它们不会获得任何收益,而解释或部分评估脚本的IDE和其他工具始终可以使用getOwnPropertyNames来提供自动完成等功能。

  

Object.getOwnPropertyNames

     

返回直接在给定对象上找到的所有属性(可枚举或不)的数组。

答案 1 :(得分:0)

经过考虑,Felix Kling的评论引出了答案。

由于它取决于具体情况,因为我不了解用户的情况,所以我不应该限制他们的选项,至少提供一个与本机对象模型一样丰富的功能集。我将允许用户在其属性上设置与Object.defineProperty类似的选项。

我认为保持用户的选项开放应被视为一项重要的编程原则,因此这不是一个艰难的决定。

问题仍然存在于默认值应该是什么。在标准javascript中,添加到原型的属性都是可枚举的。