https://www.cnblogs.com/TomXu/archive/2012/02/03/2330295.html
https://www.cnblogs.com/TomXu/archive/2012/02/06/2330609.html
三大特性
- 封装
- 继承
- 多态
使用原型继承而不是类继承达到面向对象的效果
基于原型继承实现面向对象的编程语言
ECMAScript是一种面向对象语言,支持基于原型的委托式继承。
**
原型继承与类继承的区别
基于类的继承 | 原型继承 |
---|---|
类是不可变的。在运行时,你无法修改或者添加新的方法 | 原型是灵活的。它们可以是不可变的也可以是可变的 |
类可能会不支持多重继承 | 对象可以继承多个原型对象 |
基于类的继承比较复杂。你需要使用抽象类,接口和final类等等 | 原型继承比较简洁。你只有对象,你只需要对对象进行扩展就可以了 |
类和实例(一般类,其他静态语言)
类的实例也常常被命名为对象或范例
类代表了一个实例(也就是对象)的抽象
实例的特点是:属性(对象描述 )和方法(对象活动)
关于类,我们有如下关键概念:
- 创建一个对象之前,必须声明类,首先有必要界定其类
- 因此,该对象将由抽象成自身“象形和相似性”(结构和行为)的类里创建
- 方法是通过了严格的,直接的,一成不变的继承链来处理
- 子类包含了继承链中所有的属性(即使其中的某些属性是子类不需要的)
- 创建类实例,类不能(因为静态模型)来改变其实例的特征(属性或方法)
- 实例(因为严格的静态模型)除了有该实例所对应类里声明的行为和属性以外,是不能额外的行为或属性的
基于原型
动态可变的对象
对象可以独立储存他们所有的特性(属性,方法)
原型是一个对象,它是用来作为其他对象的原始copy,或者如果一些对象没有自己的必要特性,原型可以作为这些对象的一个委托而当成辅助对象。
基于委托的原型
任何对象都可以被用来作为另一个对象的原型对象,因为对象可以很容易地在运行时改变它的原型动态。
原型作为辅助对象属性的重要功能和机制,就像是要自己的属性一下,和自身属性相比,这些属性是委托属性。这个机制被称为委托,并且基于它的原型模型是一个委托的原型(或基于委托的原型 )
引用的机制在这里称为发送信息到对象上,如果这个对象得不到响应就会委托给原型来查找(要求它尝试响应消息)
在这种情况下的代码重用被称为基于委托的继承或基于原型的继承。由于任何对象可以当成原型,也就是说原型也可以有自己的原型。 这些原型连接在一起形成一个所谓的原型链。
关于原型,我们有如下关键概念:
- 基本概念是对象
- 对象是完全动态可变的(理论上完全可以从一个类型转化到另一个类型)
- 对象没有描述自己的结构和行为的严格类,对象不需要类
- 对象没有类类但可以可以有原型,他们如果不能响应消息的话可以委托给原型
- 在运行时随时可以改变对象的原型
- 在基于委托的模型中,改变原型的特点,将影响到与该原型相关的所有对象
- 在concatenative原型模型中,原型是从其他对象克隆的原始副本,并进一步成为完全独立的副本原件,原型特性的变换不会影响从它克隆的对象
- 如果不能响应消息,它的调用者可以采取额外的措施(例如,改变调度)
- 对象的失败可以不由它们的层次和所属哪个类来决定,而是由当前特性来决定