查询JavaScript中字典的用法

时间:2014-04-15 15:15:52

标签: javascript python dictionary

下面的代码是创建字典(foo),然后在该字典中按名称bar添加方法(ack)和属性。

var foo = {};
foo.bar = function(){
     this.ack=3;
};
foo.bar();

在python中,如果我尝试这样做,

>>> foo = {}
>>> def f():
    this.ack=3

>>> foo.bar = f
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    foo.bar = f
AttributeError: 'dict' object has no attribute 'bar'

我的问题:

  1. 而不是(键,值)对,JavaScript如何允许方法(bar)成为字典的成员?

  2. 此外,JavaScript如何允许名称ack的值为3(这不是键值)成为字典的成员?

5 个答案:

答案 0 :(得分:2)

  

而不是(键,值)对,JavaScript如何允许方法(bar)成为字典的成员?

在JavaScript中,当你说

var foo = {};

你正在创建一个对象,当你指定像

这样的东西时
foo.bar = function(){
     this.ack=3;
};

它首先在bar中查找foo。如果没有,它会创建一个新属性并在其中存储函数对象。这里,key是bar,值是函数对象。

但是在Python中,你正在做一些完全不同的事情。您正在使用字典对象,当您执行foo.bar时,它会在字典对象中查找bar属性,因为它找不到它,它会立即出错。

AttributeError: 'dict' object has no attribute 'bar'

如果您在Python中寻找类似的行为,请使用此类对象

class TempClass(object):
    pass

foo = TempClass()
def function():
    ack = 3
foo.f = function
  

此外,JavaScript如何允许值为3的名称ack(这不是键值)成为字典的成员?

现在,你正在搞乱this对象。最近this绑定发生了。当您调用ack时,它会检查调用ack的对象。由于它位于foo对象上,this将设置为foo。因此,您要间接在ack上创建新属性foo

答案 1 :(得分:1)

JavaScript没有字典类型。使用{}创建的对象是对象。您可以为对象指定属性,如:

var foo = {};
foo.func1 = function () {};
foo['func2'] = function () {};
var a = 'func3';
foo[a] = function () {};

答案 2 :(得分:1)

首先,不要将 JavaScript {}视为 dict 。它是 Object ,它更接近 Python class

您可以像

一样向 Classes 的实例添加方法
from types import MethodType as bind

class Foo():
    pass

def bar(self):
    self.ack = 3

foo = Foo()
foo.bar = bind(bar, foo) # add method bar to foo as property bar
foo.bar()
foo.ack # 3

Python 中,它实际上更容易&#34;设置继承,因为您不需要import任何

Foo.baz = bar
foo.baz() # invokes inherited bar as expected

答案 3 :(得分:0)

我认为你混淆了字典,对象和对象属性。在javascript中,var foo = {};是一个对象。您可以通过foo.bar;访问该对象的属性。在python中,foo = {}是字典,而不是对象。当您在python中说foo.bar时,这没有任何意义,因为字典没有名为bar的实例变量。

Python可以在字典中存储函数引用:

>>> foo['bar'] = lambda x: x*x
>>> foo['bar'](10);
100

答案 4 :(得分:0)

JavaScript中的{}是一个对象,当你写:

foo.bar = function(){}; // property/method-name : value

它设置了对象bar的{​​{1}}方法,并且:

foo

foo.name = "Something"; // property/method-name : value 对象的name属性设置为foo

Python中的"Something"是一个字典,你可以在其中执行:

{}

如果你想在Python中复制点的行为,请使用:

foo = {}

def f():
    foo["ack"] = 3 # key-value here

foo["bar"] = f

foo["bar"]()

print foo["ack"] # 3