JS 面向对象之原型链

对象的原型链

  1. 只要是对象就有原型
  2. 原型也是对象
  3. 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成为原型链
  4. 原型链到哪里是一个头?
  5. 一个默认的原型链结构是什么样子的?(当前对象->构造函数.prototype->Object.prototype->null)
  6. 原型链结构对已知语法结构有什么修正?

原型链的结构

  1. 原型链继承就是利用就是修改原型链结构( 增加、删除、修改节点中的成员 ), 从而让实例对象可以使用整个原型链中的所有成员( 属性和方法 )
  2. 使用原型链继承必须满足属性搜索原则

属性搜索原则

  1. 所谓的属性搜索原则, 就是对象在访问属性与方法的时候, 首先在当前对象中查找
  2. 如果当前对象中存储在属性或方法, 停止查找, 直接使用该属性与方法
  3. 如果对象没有改成员, 那么再其原型对象中查找
  4. 如果原型对象含有该成员, 那么停止查找, 直接使用
  5. 如果原型还没有, 就到原型的原型中查找
  6. 如此往复, 直到直到 Object.prototype 还没有, 那么就返回 undefind.
  7. 如果是调用方法就包错, 该 xxxx 不是一个函数

属性搜索原则

在实现继承的时候,有时会利用替换原型链结构的方式实现原型继承,那么原型链结构就会发生改变

function ItcastCollection( ){ }
ItcastCollection.prototype=[ ];
var arr=new ItcastCollection( );
//arr->[ ]->Array.prototype->Object.prototype->null
//var arr=new Array( );

什么是原型式继承(这里的使用原则必须满足属性搜索原则)

所谓的原型式继承就是利用修改原型链的结构(增加一个节点,删除一个节点,修改节点中的成员)来使得实例对象可以使用整条链中的所有成员


在js中,所有的对象字面量在解析以后,就是一个具体的对象了,那么可以理解为调用的对应的构造方法
1,例如在代码中写上‘{ }’,就相当于‘new Array( )’
2,例如代码中有'[ ]',就相当于‘new Array( )’
3,例如代码中有'/ . /',相当于‘new  REgExp( ' . ’)'
注意:在底层理论执行的过程中,是否有调用构造函数,不一定,和浏览器的版本有关

原型链结构图    

  1. 构造函数 对象原型链结构图
    function Person (){}; var p = new Person();

  2. {} 对象原型链结构图

  3. [] 数组原型链结构图

  4. Object.prototype 对应的构造函数

  5. div 对应的构造函数
  6. div -> DivTag.prototype( 就是 o ) -> Object.prototype -> null

var o = {
    appendTo: function ( dom ) {
    }
};
function DivTag() {}
DivTag.prototype = o;

var div = new DivTag();


函数的原型链结构

任意的一个函数, 都是相当于 Function 的实例. 类似于 {} 与 new Object() 的关系

    function foo () {};
    // 告诉解释器, 有一个对象叫 foo, 它是一个函数
    // 相当于 new Function() 得到一个 函数对象
  1. 函数有 __proto__ 属性
  2. 函数的构造函数是 Function
  3. 函数应该继承自 Function.prototype
  4. Fucntion.prototype 继承自 Object.protoype
  5. 构造函数有prototype, 实例对象才有__proto__指向原型, 构造函数的原型才有 constructor 指向构造函数
  6. Object函数是Function的一个实例
  7. Object作为对象时继承自Function.prototype的,又Function.prototype继承自Object.prototype
  8. Function是自己的构造函数



猜你喜欢

转载自blog.csdn.net/L_AMiao/article/details/80805644