一、基于原型的语言的特点

1 只有对象,没有类;对象继承对象,而不是类继承类。

2  “原型对象”是基于原型语言的核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。

二、基于原型的语言中对象的创建

创建有两个步骤

1. 使用"原型对象"作为"模板"生成新对象

这个步骤是必要的,这是每个对象出生的唯一方式。以原型为模板创建对象,这也是"原型"(prototype)的原意。

2. 初始化内部属性

这一步骤不是必要的。通俗点说,就是,对"复制品"不满意,我们可以"再加工",使之获得不同于"模板"的"个性"。

三、原型,为复用代码而生

四、继承

五、小结

1.原型的本质就是对象引用原型对象的属性,实现代码复用。

2.基于原型的语言是以原型对象为模板创建对象。

js是世界上最容易被误解的语言,原因主要有两个:

1) 作为基于原型的语言中,却连最基本的一个通过原型产生对象的函数都没有,让人不知道js根本上是以对象创建对象。

2) 使用new关键字创建对象,让人误会js是以类似java类的构造函数创建对象,实际上,构造函数在创建对象上起到次要的作用,甚至不需要,重要的只有函数的属性prototype引用的原型对象,新对象以此为模板生成,生成之后才调用函数做初始化的操作,而初始化操作不是必要的。

记:js的面向对象是基于原型的面向对象,对象创建的方式根本上只有一种,就是以原型对象为模板创建对象,new function不是通过函数创建对象,只是刻意模仿java的表象。

七、javascript的原型本质,理解javascript的构造器模式

1.理解js的使用(new关键字+函数)的创建对象方式,new func()。

function Admin(name){

this.name = name;

this.getName = function(){return this.name};

}

var admin= new Admin('Sn');

分析上面代码。

javascript引入new关键字是为了模仿java创建对象的方式,通过语句var admin = new Admin('Sn') 就生成了一个admin对象。

我们知道,基于原型的语言生成一个步骤有两步:

第一步是使用"原型对象"作为"模板"生成新对象,

第二步是初始化新对象的内部属性。

我们敢肯定地推断,javascript中的new Admin('Sn');必然做了这两件事情,那么

1 "原型对象"在哪里?

2 怎么做到"初始化新对象的内部属性"?

答案是,admin.prototype就是我们要找的"原型对象",通过"以新对象代替this,执行admin函数"做到了"初始化新对象的内部属性"。

使用new+function的方式创建对象,其实就是应用我们设计的函数newInstance(实例化)时的思想;

function newInstance(constructor){

var obj = {};

obj.__proto__ = constructor.prototype;

constructor.call(obj,sliceArguments(arguments,1));

return obj;

}

八. javascript构造器模式的特点

1) javascript的顶层对象是Object.prototype

2) 所有对象有一个__proto__属性。__proto__指向自己的"原型对象",搜索属性的原型链以__proto__为基础。

3) 每个函数都会默认关联一个原型对象。javascript每创建一个函数的时候,都同时创建一个原型对象,赋值到函数的prototype属性,用作使用new  生成实例对象的默认原型对象。该默认原型对象的内容是

{

__proto__:Object.prototype,

constructor: 指向函数本身

}

__proto__指向Object.prototype的目的是为了使生成的实例对象继承顶层对象Object.prototype;

而constructor指向函数本身的目的是为了使生成的实例对象newObject可以直接通过newObject.constructor访问到构造函数,同时构造函数和原型对象可以互相访问也是个良好的设计。但是,实际上,constructor并没有什么用,所以大家可以不理会这个属性,这仅仅是一个优化的设计。

4) 可以修改或替换构造函数都会默认关联的原型对象。

function A(){};

function B(){};

B.prototype = new A();           //原型对象为 new A()对象

B.prototype.constructor = A;        //构造函数为A函数,可选

六、javascript对象继承体系结构

1) 所有对象都有自己的原型对象。

2)所有构造函数的原型对象都是Function.prototype,Object.prototype是最顶层的对象。

3) 通过原型继承,所有对象构成了一个完整的系统

javascript基于原型的语言的特点的更多相关文章

  1. JavaScript - 基于原型的面向对象

    JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...

  2. javascript: 基于原型的面向对象编程

    Douglas Crockford指出javascript是世界上最被误解的编程语言.由于javascript缺少常见的面向对象概念,许多程序猿认为javascript不是一个合适的语言.我在做第一个 ...

  3. javascript基于原型实现面向对象

    传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象. 原型是?我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对 ...

  4. JavaScript基于原型的继承

    在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,基于原型的继承相比基于类的继承的概念上更为简单 if( typeof Object.beget !== 'function') { Object. ...

  5. 通过JavaScript原型链理解基于原型的编程

    零.此文动机 用了一段时间的Lua,用惯了Java C++等有Class关键字的语言,一直对Lua的中的面向对象技术感到费解,一个开源的objectlua更是看了n遍也没理解其中的原理,直到看到了Pr ...

  6. 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统

    面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...

  7. Atitit.prototype-base class-based  基于“类” vs 基于“原型”

    Atitit.prototype-base class-based  基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2.  对象的产生有两种基本方式.一种是以原型(proto ...

  8. 理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。

    JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型, ...

  9. JavaScript对象原型

    一.MDN上的解释(有点抽象) 基于原型的语言? JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模 ...

随机推荐

  1. arcgispro字段计算器

    使用python语法 在python中没有类似sub()或者subString()的方法,但是字符串的截取操作却是更加简单. 只需要把字符串看作是一个字符数组,截取子串非常方便. 多余的话就不啰嗦了, ...

  2. ibatis.net:第一天,什么是 mybatis.net ?

    ibatis.net 是一个“数据映射框架”,它使得面向对应的应用程序非常的方面使用关系数据.ibatis.net 通过使用 xml 或 attribute 来解耦对象和SQL或存储过程.简单是 ib ...

  3. centos7安装debuginfo

    转自:https://www.72zk.com/show/blog/20 查看内核版本,查找对应的内核rpm文件 [root@localhost ~]#uname -rsp Linux 3.10.0- ...

  4. 关于websocket集群中不同服务器的用户间通讯问题

    最近将应用部署到集群时遇到一个问题,即用户命中不同的服务器导致的用户间无法进行websocket通讯,在网上搜索到类似问题但都没有具体解决方案. 于是用redis的订阅发布功能解决了该问题,具体流程如 ...

  5. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  6. 5G与TCP/IP

    众所周知,4G LTE全面IP化,上层传输走的是TCP/IP协议(如下图). ▲LTE用户面协议构架 但是,我们熟悉的这个构架并没有发挥出移动网络的全部潜力,甚至阻碍了未来网络的发展. 1  TCP/ ...

  7. NOI 2015 Bless All!

    明天day1,加油!RP++! (话说出题人貌似是dyf&lyd?好虚啊……

  8. 描述ARP协议的工作原理,怎么实施ARP攻击和防御ARP攻击

    什么是ARP协议?ARP,即地址解析协议,实现通过IP地址得知其物理地址.在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址.为了让报文在 ...

  9. Qt实现自定义按钮的三态效果

    好久之前做的一个小软件,好长时间没动过了,在不记录下有些细节可能都忘了,这里整理下部分功能的实现. 按钮的三态,指的是普通态.鼠标的停留态.点击态,三态是界面交互非常基本的一项功能,Qt中如果使用的是 ...

  10. Go语言之进阶篇爬捧腹网

    1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html   下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...