标签:
一、静态语言与动态语言面向对象之对比
封装:
1)封装数据:java中通过私有变量Private等实现,javascript中通过函数内的局部变量实现
2)封装实现:对象内部的变化对于外部是透明的,对象之间通过暴露的接口进行通信
3)封装类型:java中通过实现继承(抽象类)或者接口继承(接口)来想方设法实现对象类型的隐藏达到多态的效果,javascript中压根没有这个问题;
4)封装变化:这就是设计模式的目的,封装代码中变化的部分。设计模式分为三种:创建型模式目的在于封装创建对象的变化,结构型模式封装的对象之间的组合关系;行为型模式封装的是对象的行为变化;
继承:
java中继承方式有两种:实现继承(抽象类),接口继承(接口),通过抽象类或者接口一方面实现了多态,另一方面体现了一种契约约束协议;
javascript中继承通过原型链实现,不支持抽象类或者接口,javascript作为弱类型语言天然实现了多态,要体现契约协议则无法像java一样在编译时主动报错,只能在运行时或之后进行约束;
继承方式的不同本质是两者创建对象的方式不同
javac等语言创建对象遵循的是模板的设计模式,创建对象的方法是先指定它的类型,再通过类来创建这个对象,再给对象下的各个属性进行赋值等。
javascript等动态语言创建对象则采用原型模式,其对象系统就是通过原型模式构建的,在原型模式中,类是不必要的,对象未必从类中创建而来,一个对象是通过克隆另一个对象得到的,javascript中的根对象是Object.prototype,这是一个空对象。即使javascript提供了类似于java的方式创建对象,本质上底层也是通过克隆的方式产生的。原型模式实现的关键是语言本身是否提供了clone方法,ECMA5提供了object.create方法,可以用来克隆对象,在不支持该方法的浏览器中,也可以使用以下方法产生对象:
Object.creat=Object.create||function(obj){ var F=function(){}; F.prototype=obj; return new F(); }
原型模式遵循以下规则:
1)所有数据都是对象;
2)要得到一个对象,不是通过实例化对象,而是找到一个对象作为原型并克隆它;
3)对象会记住它的原型(还记得吗?javascript中每个函数都有prototype属性都指向其对象的原型,每个原型都有constructor对象指向对应的构造函数,每个对象都有一个隐藏的属性(在chrome下,该属性为_proto_)指向对应的原型对象,即对象._proto_与对象构造器.prototype的指向相同);
4)如果对象不能处理当前的请求,会把请求委托给它的原型;
多态:
(详见封装中对封装类型的解释)
javascript设计模式学习之一——javascript面向对象与java的区别
标签:
原文地址:http://www.cnblogs.com/bobodeboke/p/5588890.html