日期:2014-05-16  浏览次数:20396 次

Ruby和JavaScript对象模型的比较

概要

Ruby和JavaScript都是动态脚本语言,他们有许多地方是类似的。比如函数都是一等对象,都有高阶函数等等。。。但是我觉得最像的要属他们的对象模型,比如:他们的类型不伦不类,对象非要搞得像一个属性槽。

Ruby的对象模型

Ruby,一种为简单快捷面向对象编程而创的脚本语言。他的最大的特点就是面向对象的模型和元编程的能力,Ruby是完全面向对象的,没有任何的原始类型。要注意的是:Ruby是一门正统的面向对象的编程语言,而JavaScript就不是。如果用一句话来说Ruby的对象模型就是类即使类也是对象,而对象即使对象也是一个Hash。怎么能怎么说呢?首先看一看类就是类
class MyClass
  def the_method
    "general method"
  end
end
mc = MyClass.new
mc.the_method
正统的创建类和对象的语法,可以直接翻译成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.new
o.instance_variable_set(:@x, 0) # Note required @ prefix
o.instance_variable_get(:@x) # => 0
o.instance_variable_defined?(:@x) # => true
Object.class_variable_set(:@@x, 1) # Private in Ruby 1.8
Object.class_variable_get(:@@x) # Private in Ruby 1.8
Object.class_variable_defined?(:@@x) # => true; Ruby 
除去多余的语法,可以看到一个对象就像一个哈希表那样应付着外界的拷问。下面给这个哈希表添加一个属性。
class ClassMethodExample
  def self.foo
    puts 'class foo'
  end

  class << self
    def bar
      puts 'class bar'
    end
  end
end

class << ClassMethodExample
  def baz
    puts 'class baz'
  end
end

def ClassMethodExample.tor
  puts 'class tor'
end

ClassMethodExample.foo
ClassMethodExample.bar
ClassMethodExample.baz
ClassMethodExample.tor
这就是给类添加类方法的语法(悄悄告诉你:类方法可以被继承),对于纯正的对象也可以定义对象的实例方法。
class Person
  def talk
    puts "This is a Person class."
  end
end
p1=Person.new
p2=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,一种直译