概要Ruby和JavaScript都是動態指令碼語言,他們有許多地方是類似的。比如函數都是一等對象,都有高階函數等等。。。但是我覺得最像的要屬他們的物件模型,比如:他們的類型不倫不類,對象非要搞得像一個屬性槽。Ruby的物件模型物件導向編程指令碼語言。他的最大的特點就是物件導向的模型和元編程的能力,Ruby是完全物件導向的,沒有任何的原始類型。要注意的是:Ruby是一門正統的物件導向的程式設計語言,而JavaScript就不是。如果用一句話來說Ruby的物件模型就是類即使類也是對象,而對象即使對象也是一個Hash。怎麼能怎麼說呢?首先看一看類就是類
正統的建立類和對象的文法,可以直接翻譯成Java代碼。但是Ruby的類不僅僅存在於靜態源檔案中,他還存在於運行時。因為Ruby的一個類就是Class的一個對象,同時他還是Object的一個子類。好奇葩吧!看代碼C = Class.new D = Class.new(C) {include M def the_method"general method"end}
這兒不僅僅可以用建立對象的方法來產生類,還可以實現繼承和定義類體。這兒還有更加令人驚訝的,由於類是Class的一個對象,因此類的方法就是Class的執行個體方法。而Class繼承了Module,Module繼承了Object,Object混入了Kernel模組(Object也是一個類,雞生蛋還是蛋生雞?)。因此他們的執行個體方法都是類的類方法(也叫單例方法),相當於Java的靜態方法。接下來看看對象是一個屬性槽。o = Object.newo.instance_variable_set(:@x, 0) # Note required @ prefixo.instance_variable_get(:@x) # => 0o.instance_variable_defined?(:@x) # => trueObject.class_variable_set(:@@x, 1) # Private in Ruby 1.8Object.class_variable_get(:@@x) # Private in Ruby 1.8Object.class_variable_defined?(:@@x) # => true; Ruby
除去多餘的文法,可以看到一個對象就像一個雜湊表那樣應付著外界的拷問。下面給這個雜湊表添加一個屬性。class ClassMethodExample def self.foo puts 'class foo' end class << self def bar puts 'class bar' end endendclass << ClassMethodExample def baz puts 'class baz' endenddef ClassMethodExample.tor puts 'class tor'endClassMethodExample.fooClassMethodExample.barClassMethodExample.bazClassMethodExample.tor
這就是給類添加類方法的文法(悄悄告訴你:類方法可以被繼承),對於純正的對象也可以定義對象的執行個體方法。class Person def talk puts "This is a Person class." endendp1=Person.newp2=Person.new #定義單例方法,首先要產生一個執行個體對象,其次,要在方法名前加上對象名和一個點號“.” def p2.talk puts "This talk method belongs to p2." end def p2.laugh puts "laugh method belongs to p2." end p1.talk #This is a Person class. p2.talk #This talk method belongs to p2. p2.laugh #laugh method belongs to p2.
這就讓人不得不想到JavaScript的建立對象的文法var person = new Object();person.name = “Nicholas”;person.age = 29;person.job = “Software Engineer”;person.sayName = function(){alert(this.name);};
下面就來介紹一下JavaScript的物件模型JavaScript物件模型JavaScript直譯動態類型基於原型
Account := Object cloneAccount balance := 0Account deposit := method(amount, balance = balance + amount)account := Account cloneaccount deposit(10.00)account balance println
看看這人的clone和new有多像吧,在原型式編程中對象是複製的。但是總要有一個地方來共用所有的對象所共有的東西吧。因此,在Io中,一大寫字母開頭對象就代表一個類型;而在JavaScript中就有了Prototype,也叫原型。我覺得JavaScript中的原型就是一個類,在原型上定義的所有方法和屬性都會共用。每一個對象也可以有其自己的自訂方法,一旦在對象上定義的方法或者屬性和在Prototype定義的同名時,對象上的定義function Person(){}Person.prototype.name = “Nicholas”;Person.prototype.age = 29;Person.prototype.job = “Software Engineer”;Person.prototype.sayName = function(){alert(this.name);};var person1 = new Person();var person2 = new Person();person1.name = “Greg”;alert(person1.name);//”Greg” - from instancealert(person2.name);//”Nicholas” - from prototypedelete person1.name;alert(person1.name);//”Nicholas” - from the prototype
總之:在Ruby中,一個類是一個Class類的執行個體,也就是說:一個類就是一個對象,事實上累還是一個常量。既然類也是對象,那麼類也可以用Class及其父類中的執行個體方法。而這些執行個體方法的定義都是對象通用的方法,這也是為什麼類和對象有時會有相等的操作。同時這也導致了一些方法的差異。比如類上作用的是類方法,而對象上作用的是執行個體方法。在JavaScript中,JavaScript統一了函數和類型變數,認為他們都存在於一個容器中,這個容器就叫屬性。因此一個對象 就可以認為是一個無序的屬性列表。另外一個屬性也可以簡單的看作一個名字和他的值構成(當然不止這麼簡單)。這樣一個對象也可以看作一個哈列表。