【问题标题】:Javascript OOP: should methods be enumerable?Javascript OOP:方法应该是可枚举的吗?
【发布时间】:2013-08-06 12:27:17
【问题描述】:

我正在为 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 )

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

【问题讨论】:

  • 这完全取决于用例。
  • 你能从中看出什么意义?
  • 你说应该有允许用户在声明类时选择的语法吗?
  • @Bergi 我看到让它们可枚举的感觉是它们会变得不那么模糊......并且在大多数时候循环遍历我们感兴趣的属性时,我认为它们不可枚举在数据中而不是在方法中。也许问题是当您使用for in 时,您将其用于什么目的,您希望方法出现还是不显示?
  • 您很少需要迭代作为 OOP 对象并且在语义上不被用作字典的对象。事实上,序列化是唯一想到的事情,在这种情况下,只定义一个toJSON 方法会更方便

标签: javascript oop inheritance frameworks


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    除非有一些与键相关的语义——你鼓励你的对象的用户迭代它的属性——那么让方法是可枚举的既没有好处也没有坏处。

    隐藏它们你什么也得不到,解释或部分评估你的脚本的 IDE 和其他工具总是可以使用getOwnPropertyNames 来提供自动完成等功能。

    Object.getOwnPropertyNames

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

    【讨论】:

    • 我更新了问题以更具体地说明我在做什么
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2010-10-07
    • 1970-01-01
    • 2012-09-14
    • 2014-02-13
    • 2011-11-16
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多