1、*****Object:
1、*****继承:父对象的成员(属性和方法),子对象可以直接使用、
为什么:代码重用!节约内存空间!提升网站的性能!
何时继承:只要多个子对象公用的属性和【方法】,都要集中定义在父对象之中
2、***如何找到父对象(原型对象):保存一类子对象共有属性和共有方法的父对象:2种
1、子对象.__proto__;//前提:必须先有一个对象
2、构造函数名.prototype;//构造函数名,几乎人人都有,除了Math/Undefined/Null
3、*面试题:两链一包:
作用域链:查找变量
闭包:保护一个可以反复使用的局部变量的一种词法结构
原型链:每个对象都有一个属性:__proto__,可以一层一层的找到每个人的父亲,形成的一条链式结构,就称之为叫做原型链
可以找到所有父对象的成员(属性和方法),作用:查找属性和【方法】
最顶层是Object的原型,上面放着我们眼熟的toString,怪不得人人都可以使用toString
JS种万物皆对象
4、有了原型对象,设置共有属性和共有的方法
1、原型对象.属性名=属性值
2、原型对象.方法名=function(){}
***笔试题1:判断自有和共有:
1、判断自有:
obj.hasOwnProperty("属性名");
如果结果为true,说明一定是自有,如果结果为false,可能是共有可能是没有
2、判断共有:
if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){//in 会自动在整条圆形脸上进行查找,找到结果为true,找不到结果为false
说明是共有
}else{
说明是没有
}
完整版公式:
if(obj.hasOwnProperty("属性名")){
自有
}else{
if("属性名" in obj){
共有
}else{
没有
}
}
***笔试题2:修改/删除自有和共有
自有:修改:obj.属性名=新值;
删除:delete obj.属性名;
共有:修改:obj.__proto__.属性名=新值;
删除:delete obj.__proto__.属性名;
共有千万不要操作本地:
修改:会在本地添加同名属性
删除:没有效果
***笔试题3:如何为老IE的数组添加indexOf方法:如何为一类人添加某个方法
原理:
if(Array.prototype.indexOf===undefined){//老IE
Array.prototype.indexOf=function(key,starti){
starti===undefined&&(starti=0);
for(var i=starti;i<this.length;i++){
if(key==this[i]){
return i;
}
}
return -1;
}
}
***笔试题4:判断x是不是一个数组:4种方式
1、判断x是不是继承自Array.prototype:
Array.prototype.isPrototypeOf(x);
2、判断x是不是由Array这个构造函数创建的
x instanceof Array
3、只有数组可用:ES5提供的一个叫Array.isArray(x);
4、最麻烦:输出【对象的字符串】形式
在Object的原型上保存着最原始的toString方法
最原始的toString方法输出:[object 构造函数名]
***多态:子对象觉得父对象的成员不好用,在本地定义了同名成员,覆盖了父对象的成员
如果我们这道题能够跳过数组的爸爸,拿到数组的爷爷上面的toString也就能判断了
固定套路:借用:Object.prototype.toString.apply(x);
***笔试题5:实现自定义继承:
1、两个对象之间的继承:
子对象.__proto__=父对象
2、多个对象之间设置继承:
构造函数名.prototype=父对象
注意时机:一定要在创建对象之前
作业: 1、面向对象版 - 选项卡 2、面向对象版 - 轮播 3、面向对象版 - 购物车 4、每一道笔试题做一次