下面的代码是创建字典(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'
我的问题:
而不是(键,值)对,JavaScript如何允许方法(bar
)成为字典的成员?
此外,JavaScript如何允许名称ack
的值为3(这不是键值)成为字典的成员?
答案 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