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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript设计模式学习之一——javascript面向对象与java的区别相关的知识,希望对你有一定的参考价值。

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

  封装:

    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的区别的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin学习之一

Java学习笔记——设计模式之一简单工厂

JavaScript设计模式:面向对象编程

java23种设计模式之一: 策略模式

Java,C++,JavaScript和Python最值得学习!

java/android 设计模式学习笔记---装饰者模式