编程范式游记
陈皓(网名“左耳朵耗子”)
资深技术专家
立即订阅
2 人已学习
课程目录
已更新 11 讲 / 共 11 讲
01 | 编程范式游记:起源
免费
02 | 编程范式游记:泛型编程
03 | 编程范式游记:类型系统和泛型的本质
04 | 编程范式游记:函数式编程
05 | 编程范式游记:修饰器模式
06 | 编程范式游记:面向对象编程
07 | 编程范式游记:基于原型的编程范式
08 | 编程范式游记:Go 语言的委托模式
09 | 编程范式游记:编程的本质
10 | 编程范式游记:逻辑编程范式
11 | 编程范式游记:程序世界里的编程范式
编程范式游记
登录|注册

07 | 编程范式游记:基于原型的编程范式

陈皓 2019-07-16
基于原型(Prototype)的编程其实也是面向对象编程的一种方式。没有 class 化的,直接使用对象。又叫,基于实例的编程。其主流的语言就是 JavaScript,与传统的面对象编程的比较如下:
在基于类的编程当中,对象总共有两种类型。类定义了对象的基本布局和函数特性,而接口是“可以使用的”对象,它基于特定类的样式。在此模型中,类表现为行为和结构的集合,对所有接口来说这些类的行为和结构都是相同的。因而,区分规则首先是基于行为和结构,而后才是状态。
原型编程的主张者经常争论说,基于类的语言提倡使用一个关注分类和类之间关系的开发模型。与此相对,原型编程看起来提倡程序员关注一系列对象实例的行为,而之后才关心如何将这些对象划分到最近的使用方式相似的原型对象,而不是分成类。
因为如此,很多基于原型的系统提倡运行时原型的修改,而只有极少数基于类的面向对象系统(比如第一个动态面向对象的系统 Smalltalk)允许类在程序运行时被修改。
在基于类的语言中,一个新的实例通过类构造器和构造器可选的参数来构造,结果实例由类选定的行为和布局创建模型。
在基于原型的系统中构造对象有两种方法,通过复制已有的对象或者通过扩展空对象创建。很多基于原型的系统提倡运行时进行原型的修改,而基于类的面向对象系统只有动态语言允许类在运行时被修改(Common Lisp、Dylan、Objective-C、Perl、Python、Ruby 和 Smalltalk)。

JavaScript 的原型概念

这里,我们主要以 JavaScript 举例,面向对象里面要有个 Class。但是 JavaScript 觉得不是这样的,它就是要基于原型编程,就不要 Class,就直接在对象上改就行了,基于编程的修改,直接对类型进行修改。
我们先来看一个示例。
var foo = {name: "foo", one: 1, two: 2};
var bar = {three: 3};
每个对象都有一个 __proto__ 的属性,这个就是“原型”。对于上面的两个对象,如果我们把 foo 赋值给 bar.__proto__,那就意味着,bar 的原型就成了 foo的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编程范式游记》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • Define
    感觉更像是单例模式的一种实现 _proto_更像是静态单例 prototype则是实例的属性
    2019-08-23
  • 鼎晨ʘᴗʘ
    基于原型链的JS感觉特别难理解,还是喜欢面向对象的方式。
    2019-08-22
  • ティア(Erlin Ma)
    加深了对js的灵活性的理解,大概很多前台的库也是用此发挥的吧?!回头自己动手试试,相信水平会有所提升!
    2019-08-21
  • jonnypppp
    能够对原型有一些理解了
    2019-08-20
  • Transient
    现在出了ES6的标准,而且也在进行大范围的推广。那么是不是基于原型的编程范式就过时了?
    我自己还是觉得以class方式的面相对象编程更容易理解,这可能应该是编程习惯和自己本身技术能力也不够造成的原因吧。
    2019-08-01
    1
收起评论
5
返回
顶部