码迷,mamicode.com
首页 > 编程语言 > 详细

javascript设计模式学习之一——javascript面向对象与java的区别

时间:2016-06-15 22:12:50      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

一、静态语言与动态语言面向对象之对比

  封装:

    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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!