面向对象笔记2 原型链 解释
面向对象2
## js中已经写好的构造函数
* 内置对象
* js提供的已经定义好的对象
* Array,Date,RegExp,String,Number,Boolean
* 同时js定义好了对应的一些构造函数
* * 字符串,数字等基础类型数据是没有属性和方法的。
* ??那么我们平时创建了一个字符串(非字符串对象)的时候,为什么可以调用他length,indexOf等属性或方法??
* 上面问题的答案就是:包装对象
* * 包装对象
* 当我们去调用字符串,数字,布尔值这三种基础数据类型的属性和方法的时候,他们本身是不具备属性和方法的,
但是js内部,会自动的去调用他们对象的构造函数,然后把他们的值作为参数进行传入,然后执行对应属性或方法,并把结果进行返回
* 包装对象一共有三个: * String,Number,Boolean
函数原型链
## 个人对函数原型链的理解
**注意__proto__这个对象在每个对象中都存在
而通过 new object()创造的对象的__proto__是没有prototype的 为构造函数的最顶层。
首先确定一个函数为构造函数 如 function construction(){ 在构造函数创建时会创建一个空对象{},函数中的this 指向该空对象 输出的值也为该空对象
同时构造函数中也有一个prototype对象该对象是由 var prototype=new object() ;
生成的 所以 object 为prototype的构造函数 } 通过 var fn = new construction();来调用(所谓构造函数和一般函数的区别就是用new来调用)
那么此时的fn就为构造函数输出的this对象指向的对象 fn.x(通过fn.x来调用x方法)判断呢this对象中是否有x 若没有则查看this对象中的__proto__对象中是否有这个方法
而this中的__proto__指向的是构造函数中的prototype这个对象查看prototype中是否存在这个方法 若没有查看prototype对象中的__proto__是否存在
而构造函数中的prototype的__proto__指向的是创造prototype这个对象的js自己封装的object()这个函数中的prototype
再在其中寻找是否存在x方法若没有在其中的__proto__中寻找 若没有就返回underfined;
与原型链有关的一些方法
hasOwnProperty() * 判断某个属性(方法)是否是某个对象自有的,就是非原型链上的 constructor
* 属性:返回某个对象的构造函数 instanceof
* 运算符 * 判断一个对象是否是某个构造函数的实例化对象 返回布尔值。
面向对象的继承
我们先创建了一个构造函数,可以应用于某些元素 但我们有其他元素的应用需要在之前的构造函数上进行添加那么我们就要用到继承列
function Drag(element){//为原构造函数 }
function DragLimit(element) {//需要在原构造函数上进行添加的新构造函数
// 调用Drag函数,并把Drag中this指向DragLimit的this Drag.call(this, element);
//改变this指向 让Drag函数中的this指向改变指向当前 for (var property in Drag.prototype) {在通过for in 赋值来 让DragLimit()中的
内容等于Drag中内容 console.log(property);
// forin不只是会把Drag.prototype自身的属性循环出来,还会把一些原型链上的属性和方法也循环
出来 if (Drag.prototype.hasOwnProperty(property)) { DragLimit.prototype[property] = Drag.prototype[property]; } };
为什么不通过赋值DragLimit.prototype = Drag.prototype;来做呢 因为在object类型中(数组 对象)若通过赋值 那么你改变赋值的对象中的内容
原对象的内容也会被改变。 为什么呢,解释。 当我们在js中通过var申请并赋值时 我们会在内存中申请一个位置来存放 我们的var 的东西 如var a=1;
但这个a所记录的是1这个值在内存中存放的位置。 当我们通过var a=[1,2,3]时在内存中申请一个位置存放的是数组中的1这个值所在的位置,而[]
中这些内容被存放在内存中的另一个地方存放1的位置中同时也记录了[]中2存放的位置依次类推。 当我们通过varb=a 让b=a这个数组内容时 只不过是让b记录
a所记录的是1这个值在内存中存放的位置 并不是新开辟一个地方在存放一组数组,所以b所使用的仍然是a中的数组的所以当b数组进行修改时修改的是a中存放
的这个内容 所以a也会发生改变。