js:语言精髓笔记7----原型继承
面向对象有三个基本特性:封装,继承,多态;如果都满足的话称为面向对象语言;而部分满足则称为基于对象语言;
数据类型实现模型描述:

JavaScript对象模型:

构造过程:函数->构造器
- 构造器首先是一个函数,可以理解为函数初始化的时候其prototype是无值的,只有在需要引用到原型时,才具有构造器的的特性;
- 函数的原型总是一个标准的、系统内置的Object()构造器的实例;
- 该实例创建后construct属性总先被赋值为当前函数;
继承复制:
- 构造复制:每构造一个实例就从原型中复制一个映像,它和原型占用了相同的空间;
- 写时复制:每构造一个实例就使其指向原型;当读的时候顺着指示去读原型;当写对象的时候才将原型复制下来;以后读没写过的实例顺着指示,写过的则直接访问映像;
- 优化的写复制(也是js原型继承采用的):把写复制的粒度从原型变成成员,仅当要写某个实例的成员时,将成员的信息复制到实例映像中,产生一张成员列表;
- 确保在读取的时候成员表首先访问到;
- 如果在成员表中找不到,则沿着对象遍历整个原型链;
空对象(null):
- 属于对象类型,所以可以进行枚举;
- 对象是空值,所以枚举不出任何属性或方法;
- 不是来自Object()构造器的实例,instanceof返回false //null instanceof Object;
空的对象({}/new Object()):
- 空的对象只有预定义的属性和方法,这些并不会被枚举到;
- 空的对象是所有对象的基础;
- Object()构造器的原型就是一个空的对象;
- 构造:根据继承复制,可以理解空对象的基本构造为
- 一个^proto指向Object.prototype;
- 一个^proto指向一个空表;
预定义属性和方法:
- 原型(Object.prototype):
- toString //动态语言
- toLocaleString //动态语言
- valueof //动态语言
- construct //对象系统:构造
- propertyIsEnumerable //对象系统:属性
- hasOwnProperty //对象系统:属性
- isPrototypeof //对象系统:原型
- 构造器(一般函数):
- call //函数式语言
- apply //函数式语言
- caller //函数式语言
- bind //函数式语言
- arguments //动态语言
- length //动态语言
- prototype //对象系统:原型
- EM5对Object()构造器扩展:
- create //对象系统:构造
- getPrototypeOf //对象系统:原型
- defineProperty //对象系统:属性
- defineProperties //对象系统:属性
- getOwnPropertyDescriptor //对象系统:属性
- keys //对象系统:属性
- getOwnPropertyNames //对象系统:属性
- seal //对象系统:属性
- freeze //对象系统:属性
- preventExtensions //对象系统:属性
- isSealed //对象系统:属性
- isFrozen //对象系统:属性
- isExtensible //对象系统:属性
原型链:
- constructor的维护:
- 在重置原型后就修改原型的constructor属性;
MyObjectEx.prototype = new MyObject();
MyObjectEx.protptype.constructor = MyObjectEx; - 在构造器内初始化实例时保证constructor属性;
function MyObjectEx() {
this.constructor = arguments.callee;
}
- 在重置原型后就修改原型的constructor属性;
- 原型链prototype;
- 内部原型链:
- 面向对象继承性的约定:子类必须与父类具有相似性;
- 对象实例内部有_proto_属性,用户无法访问;即使修改constructor,也不用担心实例与父类的一致性;
- 总结:内部原型链是JS原型继承机制所需的,而通过constructor与prototype所维护的构造器原型链是用户代码回溯的时候需要的;
原型继承的实质:
- 基于原型继承的对象系统:将对象(类)的继承关系与对象(类)的行为描述进行分离; //理论上可以先构建一个没有任何成员的继承系统,然后不断修改原型。
js:语言精髓笔记7----原型继承的更多相关文章
- js:语言精髓笔记12--动态语言特性(2)
对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...
- js:语言精髓笔记8--对象系统
封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...
- js:语言精髓笔记5----语言分类
计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类: //编程的经典法则 ...
- js:语言精髓笔记11--动态语言特性(1)
语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...
- js:语言精髓笔记9--函数式语言特征
形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...
- js:语言精髓笔记4----面向对象概要与运算符二义性
实例创建:obj = new contructor[(arguments)]; //如果没有参数可以忽略括号:所以注意这不是函数调用: 直接量与初始器:在之前的基本表达式中将直接量与初始器分开,这时因 ...
- js:语言精髓笔记2--表达式
表达式:由运算符和运算元构成:JS中没有运算符的表达式称为单值表达式:没有运算元,孤立与代码上下文的运算符是不符合语法的:(表达式是有返回值的) 单值表达式: this引用: 变量引用: 直接量: n ...
- js:语言精髓笔记1--标识符与基本类型
标识符: 命名: 语法以及类型----语法关键字 //逻辑 值(的存储位置)----变量和常量 ...
- js:语言精髓笔记13--语言技巧
消除代码全局变量名占用: //本质是使用匿名函数: void function(x, y, z) { console.log(x + y + z); }(1,2,3); //要使函数内的变量不被释放, ...
随机推荐
- 悦动达人 (多维dp)
悦动达人 Description 一个游戏,在屏幕上有5个格子形成一行,每一秒都会有一个格子闪烁,格子闪烁时你需要保证至少有一只手指在格子上面, 现在我们已经知道第i秒时,第xi个格子会闪烁,我们假设 ...
- 把 表拷贝到test测试数据库
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) bundle exec rake db:schema:load RAILS_ENV=test 注 ...
- 2015安徽省赛 D.锐雯上单不给就送
题目描述 <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配的战网平台,包 ...
- Python os.system 和 os.popen的区别
(1) os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) -> exit_statusExecute the command ...
- BZOJ2904
找了一个晚上的资料,拼凑出来这么一个东西: 1) 如果是完全平方数返回12) 如果可以表示成形如$x^2+y^2$的形式输出2.这要求该数质因数分解后形如$4k+3$的质因数次数都是偶数.3) 如果该 ...
- nginx 反向代理 google
nginx的反向代理,google一直都是不容易打开的,如果你有一台位于国外的vps或者服务器,就可以轻松解决这个问题,这次的主角是nginx,nginx的反向代理现在已经发展很强大了,很多时候拿他来 ...
- thinkcentre m8380t黑屏 解决办法
问题: 开机后,显示器上显示“无信号输入”,一直黑屏,但是主机的风扇.硬盘声音都正常. 解决办法: 把vga线等加紧了一些,屏幕还是不亮,然后我关掉插排电源,给cmos放了电,再重启就可以了. 这时需 ...
- 【Spring】Spring系列2之bean的配置
2.bean的配置 2.1.IOC概述 2.2.bean的获取 2.3.依赖注入方式 2.4.属性注入细节 内部bean,不需要ID,ID无效,外部不能引用: 2.5.集合属性注入 2.6.使用p命名 ...
- bootstrap的select2校验及不影响原来的格式
<style> .has-error .select2-choice, .has-error .select2-choices, .has-error.simple .select2-ch ...
- Windows远程桌面连接如何直接使用剪贴板功能
连接到Windows Server服务器时,通常使用远程桌面连接,那么如果有些时候按照习惯复制本地文件到远程服务器发现无法粘贴怎么办,这个时候稍微设置一下就OK了, 首先重新运行远程桌面连接,在登陆界 ...