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原型模型中,原型是从其他对象克隆的原始副本,并进一步成为完全独立的副本原件,原型特性的变换不会影响从它克隆的对象
  • 如果不能响应消息,它的调用者可以采取额外的措施(例如,改变调度)
  • 对象的失败可以不由它们的层次和所属哪个类来决定,而是由当前特性来决定