Javascript OOP:方法应该是可枚举的吗? 我正在为JavaScript开发一个新的OOP模型,我想知道您是否认为对对象枚举或仅对数据成员进行方法是正确的。我能从这两方面看出一些道理,也许没有明确的答案
还可以使自己的方法可枚举,而继承的方法不可枚举 也就是说,我觉得让所有数据成员都可以枚举是有意义的,即使它们是继承的 更新:从人们的回答来看,这似乎不清楚。我正在创建一个OOP模型,该模型允许用户编写如下内容来声明一个类: 更新2:在项目结束的同时,这就是它的现状:。在它中,包括方法在内的用户定义属性是可枚举的,而由框架添加的属性则不是Javascript OOP:方法应该是可枚举的吗? 我正在为JavaScript开发一个新的OOP模型,我想知道您是否认为对对象枚举或仅对数据成员进行方法是正确的。我能从这两方面看出一些道理,也许没有明确的答案,javascript,oop,inheritance,frameworks,Javascript,Oop,Inheritance,Frameworks,还可以使自己的方法可枚举,而继承的方法不可枚举 也就是说,我觉得让所有数据成员都可以枚举是有意义的,即使它们是继承的 更新:从人们的回答来看,这似乎不清楚。我正在创建一个OOP模型,该模型允许用户编写如下内容来声明一个类: 更新2:在项目结束的同时,这就是它的现状:。在它中,包括方法在内的用户定义属性是可枚举的,而由框架添加的属性则不是 ;(function( namespace ) { 'use strict'; namespace.Shape = Shape va
;(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 )
所以问题是你是否会用它来声明你的类,您会假定/希望方法是可枚举的还是不可枚举的,或者是否应该有一种方法来配置类范围或每个成员是否应该是可枚举的?除非有一些与键相关的语义——您鼓励对象的用户对其属性进行迭代——那么这既没有优点也没有缺点使方法可枚举 隐藏它们不会带来任何好处,IDE和其他解释或部分评估脚本的工具总是可以用来提供自动完成等功能 Object.getOwnPropertyNames 返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组
经过考虑,费利克斯·克林的评论得出了答案 因为这取决于具体情况,而且我不知道用户的情况,所以我不应该限制他们的选择,至少应该提供与本机对象模型一样丰富的特性集。我将允许用户在其属性上设置类似于的选项 我认为,保持用户选项的开放性应该被视为一个重要的编程原则,因此这不是一个艰难的决定
问题仍然在于违约应该是什么。在标准的javascript中,添加到原型中的属性都是可枚举的。这实际上取决于用例。你认为这有什么意义?你说应该有语法允许用户在声明类时选择它吗?@Bergi我认为让它们可枚举的意义是,它们将不那么模糊。。。由于它们不可枚举,我认为大多数时候在循环属性时,我们对数据而不是方法感兴趣。也许问题是,当您在中使用时,您使用它的目的是什么?您是否希望显示方法?您很少需要迭代OOP对象,并且在语义上不被用作字典的对象。事实上,序列化是我唯一想到的事情,在这种情况下,定义
toJSON
方法更方便。我更新了这个问题,使之更具体地说明了我在做什么