Javascript如何重载方法和处理键

时间:2015-11-25 21:52:30

标签: javascript overloading

我试图像Python一样实现字典。所以,我想有一个key()方法返回添加到子类Dict的键,但不是属性,如Object'方法"键"

再次编辑 基本上,我正在创建一个类来将设置传递给函数(arg1,arg2,myObj),其中我的对象是{map:texMap,alphaMap:aTexMap}。它适用于Three.js,我必须等待图像下载才能在3D对象上创建设置。因此,像var d = { a: aData b: bData }中的d所期望的接口,但隐藏了用户未添加的方法等。

即在return this.prototype.propertyName通过时不要own

这是我到目前为止所拥有的:

function Dict(){
    this.prototype = {};
    var _keys = this.prototype.keys;
    this.keys = function(own){
        if(typeof own === 'undefined') { return _keys(); }
        var ownKeys = [];
        for(var key in _keys()){
            if(this.hasOwnProperty(key)) {
                ownKeys.push(key);
            }
        }
        return ownKeys;
    }
}

这会如下工作吗?有没有更好的或已经存在的方法呢?

  • 将重载的keys()方法保存到私有var
  • 像往常一样返回所有内容,除非own解析为真。
  • 如果own == true,请获取常用密钥并过滤掉这些密钥 属于超类。

关于这个问题,我可能最关心的是将原型方法保存为获取所有密钥并过滤出原型密钥的方法。

另外,我读过重载并不是内置于Javascript中的。但是,我发现的大部分内容都涉及独立功能,例如this Q&A on best practices.我不需要内置方式,但我会利用任何可用的功能(因此,使用Object作为Dict)。

感谢任何反馈!

修改 在Python中,我们得到了这个:

In[2]:  d = {}
In[3]:  'has_key' in d.keys()
Out[3]: False
In[7]:  'has_key' in d.__class__.__dict__.keys()
Out[7]: True
In[8]:  d.has_key('has_key')
Out[8]: False
In[9]:  d['newKey'] = 5
In[10]: d.newKey  # ERROR

Python在其类中包含 dict 属性,其中函数通过点访问(参见In [8] ...)。因此,那些标准{}或dict()函数和运算符被隐藏(非私有),而键/数据被添加到用户的dict则通过[]访问。 d [' newKey'] = 5添加新密钥或覆盖旧密钥并将数据设置为5。

我不需要所有这些工作,尽管它会很棒。 keys()返回类似Python的键现在可以。

1 个答案:

答案 0 :(得分:0)

这里似乎存在多个问题。

您似乎想要将变量参数传递给函数:

  

我正在创建一个类来将设置传递给像function(arg1, arg2, myObj)这样的函数,其中我的对象是{map: texMap, alphaMap: aTexMap}

JS函数参数非常灵活。

  • 您可以为每一个设置名称:

    function foo(arg1, arg2, map, alphaMap)
    

    并直接传递值。对于处理固定参数集的函数,此样式是首选。

  • 或者您可以设置"选项"收集键和值的对象:

    function foo(options)
    

    并传递{arg1: val1, arg2: val2, map: valMap, alphaMap: valAlphaMap}。这种样式通常出现在构造函数上,这些函数使用特定的配置选项初始化对象。

  • 或者您可以设置空函数签名

    function foo() 
    

    并使用函数内的arguments集合。这可以在使用可变数量的统一参数(想象add(1, 2, 3, 4, 6))或严格的位置参数而不是命名参数的函数中找到。

在任何情况下,即使函数签名中有参数列表,在JavaScript中传递参数也是可选的。你可以自由地传递任何,更少或更多的参数。当然,如果它适合你,所有这些方法都可以结合起来。

  

它适用于Three.js,我必须等待图像下载才能在3D对象上创建设置。

这是由Web的异步性质引起的问题。解决方案是使用事件处理程序。这些是回调或 - 作为回调的抽象 - 承诺。

  

因此,d中的var d = { a: aData b: bData }可以预期接口,但隐藏用户未添加的方法等。

这可以通过不向数据对象添加方法等来解决,或者至少不是直接解决。如果数据对象必须具有行为,则将它们添加到原型中。

直接等效于Python Dict是JavaScript中的普通对象。

var dict = {};

Python的keys()方法的直接等价物是JavaScript中的Object.keys()静态方法。

var keys = Object.keys(dict);

要迭代键,您可以使用命令式方法:

var i, key;
for (i = 0; i < keys.length; i++) {
    key = keys[i];
    doSomething(key, dict[key]);
}

或功能性

keys.forEach(function (key) {
    doSomething(key, dict[key]);
});

在JavaScript中,Python in的直接等价物为.hasOwnProperty()

if ( dict.hasOwnProperty('foo') ) ...

或者,如果它是没有原型链的纯数据对象,您也可以使用in

if ('foo' in dict)

不推荐在for循环中使用in,因为它也会迭代原型属性。防止这种情况的方法是使用Object.keys()代替.hasOwnProperty(),或者将其与var key; for (key in dict) { if ( dict.hasOwnProperty(key) ) ... } 组合使用。

preg_respuesta

你的问题表明你缺少关于JS的基本拼图,并尝试用更熟悉的Python结构替换它们。我建议不要这样做。

我还怀疑你试图将基于类的基于类的inhertiance模式转变为JS&#39;基于原型的继承模式。我强烈建议你不要这样做。