`
liano
  • 浏览: 25857 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

python vs javascript

阅读更多
python的结构体(包括class,function 和class 实例)和javascript的结构体(Object和function)实现有些相似,也有些不同。

python的class对数据和函数的存储都是维绕着__dict__.
对象的属性和方法都存在里面。
而javascript的对象(Object或function)应该有两个hash存储数据,一个是prototype,一个是xxx(现在还不知道叫什么, 存储对象自己的方法和数据)。也是数据和方法混合存储。

对于对象的实例方法的搜索,二者也是差不多。
python中:
class Dog():
  def spark(self):
      print "spark"

dog = Dog()
dog.spark() #输出 spark

dog.__dict__中没有任何东西,当dog.spark调用时,python首先在dog__dict__中找spark,如果没有,就从class Dog中的__dict__中查找。
class dict中的函数没有copy到instance中去。

对于javascript:
function Dog(){}
Dog.prototype.spark = function(){alert('spark');}

dog = new Dog();

dog.spark(); #输出spark

如果修改class Dog的方法会影响dog的方法吗?
Dog.prototype.spark = function(){alert('spark2');}

dog.spark() #输出spark2
变了。
所以javascript的方法检索和python一样。

python和javascript感觉很像,
从python的class和function的定义方式, key:value, 就可以看出,python的核心就是dict。
而javascript的prototype也就是一个dict。
他们对于方法和数据都是混合存储的。不加”()“就是方法本身,加了“()”就是对方法进行调用。

这和ruby的实现方式就不一样了。
因为ruby是OO的纯爷们,内部区分了成员变量和方法,所以存储也是分开的iv_table和m_table.
而class实例化的过程中,又和javascript有点像。
javascript中prototype中定义的方法相当于ruby中的instance_methods。里面的东西是可以在函数检索的范围。不同的是,js的函数是copy的。ruby在class实例中只是保存了一个指向class的指针k_class.
js和ruby的class都是把函数分成了两部分,instance_methods(prototype)和class methods(对象私有方法)


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics