js:语言精髓笔记7----原型继承
2014-11-06 19:09
232 查看
面向对象有三个基本特性:封装,继承,多态;如果都满足的话称为面向对象语言;而部分满足则称为基于对象语言;
数据类型实现模型描述:
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属性;
在构造器内初始化实例时保证constructor属性;
原型链prototype;
内部原型链:
面向对象继承性的约定:子类必须与父类具有相似性;
对象实例内部有_proto_属性,用户无法访问;即使修改constructor,也不用担心实例与父类的一致性;
总结:内部原型链是JS原型继承机制所需的,而通过constructor与prototype所维护的构造器原型链是用户代码回溯的时候需要的;
原型继承的实质:
基于原型继承的对象系统:将对象(类)的继承关系与对象(类)的行为描述进行分离; //理论上可以先构建一个没有任何成员的继承系统,然后不断修改原型。
数据类型实现模型描述:
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; }
原型链prototype;
内部原型链:
面向对象继承性的约定:子类必须与父类具有相似性;
对象实例内部有_proto_属性,用户无法访问;即使修改constructor,也不用担心实例与父类的一致性;
总结:内部原型链是JS原型继承机制所需的,而通过constructor与prototype所维护的构造器原型链是用户代码回溯的时候需要的;
原型继承的实质:
基于原型继承的对象系统:将对象(类)的继承关系与对象(类)的行为描述进行分离; //理论上可以先构建一个没有任何成员的继承系统,然后不断修改原型。
相关文章推荐
- js:语言精髓笔记1--标识符与基本类型
- js:语言精髓笔记6----作用域
- 【MDNjs笔记】——入门——第三章——对象.构造函数.原型链.继承
- js:语言精髓笔记2--表达式
- 2016.06.15廖雪峰JS__学习笔记(原型继承)__P9
- 《JS高程(3)》原型链继承模式 -第6章笔记(04)
- js:语言精髓笔记4----面向对象概要与运算符二义性
- js:语言精髓笔记13--语言技巧
- js:语言精髓笔记9--函数式语言特征
- [1009]JS语言精髓与编程实践笔记1
- js:语言精髓笔记5----语言分类
- js:语言精髓笔记11--动态语言特性(1)
- js:语言精髓笔记12--动态语言特性(2)
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
- 【09-23】js原型继承学习笔记
- js:语言精髓笔记10--闭包
- HTML5学习笔记(十六):原型、类和继承【JS核心知识点】
- js:语言精髓笔记8--对象系统
- js:语言精髓笔记3----语句
- JavaScript高级程序设计(第2版) 学习笔记:(六)js基于构造函数与原型的继承