1、问题
同时熟悉Java语言和JS语言的程序员应该知道,二者创建对象的方式是不同的。
Java创建对象,首先需要定义一个类,然后调用它的构造器创建一个对象。
JS创建对象则不同,首先需要定义一个Function,它扮演构造器的角色。同时构造器也存在prototype属性,它的值为原型对象,新创建的对象都从该对象中继承属性和方法。
后一种模式本质上就是原型模式,在使用原型模式时,要将某个对象作为原型对象,剩余对象直接继承该对象中拥有的属性和方法。
使用原型模式的目的是:
- 为了更快速,更方便的创建对象,而不是从头开始,原型对象中可以封装很多公共的属性,新对象直接继承即可。
- 它提高了性能,节省了内存空间。
解决方案:
- 第一步:需要选定原型对象,原型对象为1到多个,也可以形成原型链。
- 第二步:通过原型对象创建新对象,可以自己写方法实现,也可以直接调用Object.clone方法。
在Java语言中,原型对象必须存在于新对象的类层次结构中,意味着它们或许是同一种类型,或许原型类与新对象之间存在继承关系
2、代码
使用JS语言,随便创建一个对象,反而会更好理解。
// 构造器函数 Function Test() {
} // 创建对象 let testObj = new Test(); // 之后分析testObj对象和Test对象的原型链。学过JS的程序员,这个应该非常简单。
3、讨论
1. 问题1:它的优点和缺点是什么?
答:我认为对比JS语言创建对象的方式与Java语言创建对象的方式,分析它们的优点和缺点,对理解原型模式有很大的帮助。从书中都读过JS是弱面向对象语言,”弱”究竟体现在哪些地方,貌似面向对象的三大特点封装,继承,多态,JS都可以实现,而且JS在创建对象时也表现的更灵活。在创建复杂的类体系结构时,JS语言也毫不逊色。
2. 问题2:实现原型链关键点有哪些?
答:首先是原型对象的选定,或者是原型链的选定。
其次是根据原型对象在创建新对象时需要从原型对象上继承属性和方法,不是把这些方法和属性拷贝到新对象中。
最后是访问新对象中的属性和方法时,如何模拟访问原型链的过程。这些问题还是很复杂的。
3. 问题3:在Java语言中如何实现它?
答:JS中Object有create方法,而Java语言中有clone方法。但是这些方法都只实现了其中的一个步骤,根据原型链对象创建新对象。许多问题还需要考虑,如果有一天作者看到相关的实现方式,会补充这部分的内容。
4. 问题4:深克隆和浅克隆?
答:对于基本数据类型,二者没有差异。对于对象类型,浅克隆复制引用,深克隆复制数据。
举个例子,假设把文件比作”对象的数据”,快捷方式比作”对象的引用”,浅克隆相当于拷贝了快捷方式,深克隆相当于拷贝了文件本身。
4、示例
JS语言中创建任何对象都是这样的例子。