*****Object: 1、*****继承:父对象的成员(属性和方法),子对象可以直接使用 为什么:代码重用!节约内存空间!提升网站性能! 何时继承:只要多个子对象共用的属性或【方法】,都要集中定义在父对象之中
2、***如何找到原型对象:保存一类子对象共有属性和共有的方法的父对象:
1、对象名.__proto__;//必须现有一个对象
2、构造函数名.prototype;//构造函数名:Array、Date、RegExp、Object、自定义构造函数...几乎人人都有,除了Math
3、*面试题:两链一包:作用域链(查找变量)、原型链(查找属性和方法)、闭包(保护反复使用的局部变量)
每个对象都有一个属性:.__proto__,可以一层一层的找到每个的父亲,形成的一条链式结构,就称之为叫做原型链
可以找到所有父对象的成员(属性和方法),作用:查找属性和方法,哪怕自己没有
最顶层的是Object的原型,上面放着一个我们眼熟的toString,怪不得人人都可以用到toString();
JS万物皆对象
4、有了原型对象,设置共有属性和共有方法:
原型对象.属性名=属性值;
原型对象.方法名=function(){};
***继承具有非常多的鄙视题:
1、判断是自有还是共有:
1、判断自有:obj.hasOwnProperty("属性名");
true->自有 false->没有或共有
2、判断共有:
if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){
//in会自动在obj的原型链上进行查找,如果找到了结果为true,如果没找到结果为false
}
公式:
if(obj.hasOwnProperty("属性名")){
//自有
}else{
if("属性名" in obj){
//共有
}else{
//没有
}
}
2、修改/删除自有和共有:
修改和删除自有:
修改:obj.属性名=新值
删除:delete obj.属性名;
修改和删除共有:一定要找到原型对象做操作,千万不要在本地做操作,修改(添加了一个同名属性),删除(无效果)
修改:原型.属性名=新值
删除:delete 原型.属性名;
3、如何为老IE的数组添加indexOf方法,而且这道题不是固定的,可能是为一类人添加方法
if(Array.prototype.indexOf===undefined){
//老IE,加这句话是为了性能:主流浏览器有这个方法,完全不需要我去创建,我这一拖代码只希望老IE用上
Array.prototype.indexOf=function(key,starti){
starti===undefined&&(starti=0);
for(var i=starti;i<this.length;i++){
if(this[i]==key){
return i;
}
}
return -1;
}
}
更多的案例见:07鄙视-为老IE的数组添加indexOf方法.html
4、如何判断x是不是一个数组:千万别用typeof(),只能检查原始类型,不能检查引用类型
4种:
1、判断x是不是继承自Array.prototype
Array.prototype.isPrototypeOf(x);
//true - 说明是数组 false - 说明不是数组
2、判断x是不是由构造函数Array创建出来的
x instanceof Array;
3、Array.isArray(x); - ES5提供的,只要是ES5+,老IE都不支持,此方法只有数组可用
4、输出【对象的字符串】形式
在Object的原型上保存着最原始的toString方法
原始的toString输出形式:[object 构造函数名]
***多态:子对象觉得父对象的成员不好用,在本地定义了同名成员,相当于覆盖了父对象的成员。
不严格的说法:同一个函数名,不同的人来使用,出现的效果是不一样的
固定套路:借用:Object.prototype.toString.apply(x); === "[object Array]" 说明一定是数组
5、实现自定义继承:
1、两个对象之间设置继承
子对象.__proto__=父对象;
2、批量设置继承:
构造函数名.prototype=父对象;
时机:先继承,再创建。
作业: 1、轮播、选项卡 - 面向对象开发方式 2、5道鄙视