1、*****Object面向对象:
1、*****继承:父对象的成员(属性和方法),子对象可以直接使用
为什么继承:代码重用!节约内存空间
何时继承:只要多个子对象公用的属性和【方法】,都要集中定义在父对象之中
2、JS的面向对象是基于原型(爸爸)的
什么是原型:保存一类子对象共有属性和共有【方法】的父对象(原型对象),每个对象天生就有一个原型
1、*获取原型对象:2种
1、对象名.__proto__; - 前提:必须先创建出一个对象,才可以使用此属性找到原型对象
2、构造函数名.prototype; - 构造函数名:Array、Function、Date、RegExp、h52204... - 哪怕没有创建过任何对象也能找到原型
2、*****两链一包:
作用域链:以函数EC的scope chain属性为起点,经过AO逐级引用,形成的一条链式结构,作用:查找变量的,带来了变量的使用规则:优先使用自己的,自己没有找全局,全局没有则报错
闭包:保护了一个可以反复使用的局部变量的词法结构
原型链:每个对象都有一个.__proto__的属性,可以不断的连续.找到爸爸-爷爷-祖祖...形成的一条链式结构
经过尝试,发现最顶层:Object.prototype是对象的原型,所有也就有了一句话:万物皆对象
作用:查找属性和方法,自己没有的属性和方法,可以自动顺着原型链进行查找,所以我们知道为什么人人都可以使用toString,因为toString在最顶层的
3、获取到原型对象则可以设置共有属性和共有方法
原型对象.属性名=属性值;//共有属性
原型对象.方法名=function(){};//共有方法
自有和共有
自有:保存在对象本地的属性
共有:保存在父(原型)对象的属性,所有的子对象都可以使用
笔试题:
1、*如何判断自有和共有
判断自有:obj.hasOwnProperty("属性名");
返回一个布尔值:true说明是自有,false可能是共有也可能是没有
判断共有:2个条件:
1、不是自有:obj.hasOwnProperty("属性名")==false;
2、自动在原型链检查:"属性名" in 对象名;
if(obj.hasOwnProperty("属性名")==false&&"属性名" in 对象名){
//共有
}
完整版:
if(obj.hasOwnProperty("属性名")){
console.log("自有");
}else{
if("属性名" in 对象名){
console.log("共有")
}else{
console.log("没有")
}
}
2、*修改或删除属性
1、修改和删除自有属性
修改:obj.属性名=新值;
删除:delete obj.属性名;
1、修改和删除共有属性
修改:原型对象.属性名=新值;
删除:delete 原型对象.属性名;
3、*****为老IE的数组添加indexOf方法 - 这道题不是固定的:为某一类人设置一个方法
if(Array.prototype.indexOf===undefined){//我不希望主流浏览器也执行到这些代码,我只希望老IE执行到
Array.prototype.indexOf=function(key,starti){//indexOf的执行原理
starti===undefined&&(starti=0);//说明用户没有传入开始位置,我们就给用户设置为从下标0开始查找
for(var i=starti;i<this.length;i++){//从开始位置处,循环数组后面的每一个文字和用户输入的关键字进行匹配
if(this[i]==key){
return i;//匹配到了返回对应的下标
}
}
//没匹配到,返回-1
return -1;