一、Object
1、继承:父对象的成员(属性和方法),子对象可以直接使用
优点:代码重用,节约内存空间,提升网站性能。
2、如何找到父对象(原型对象):保存一类子对象共有属性和共有方法的父对象
① 对象名.__proto__;//必须先有一个对象
②构造函数名.prototype;//构造函数名,几乎人人都有,除了Math
3、面试题:
两链一包:作用域链、原型链、闭包
每个对象都有一个属性:__proto__,可以一层一层的找到每个人的父亲,形参的一条链式结构,就称之为叫做原型链。
可以找到所有父对象的成员(属性和方法),作用:找共有属性和共有方法的
最顶层是Object的原型,上面放着我们一个眼熟的toString,怪不得人人都可以用到toString();
JS万物皆对象。
4、有了原型对象,设置共有的属性和方法:
①原型对象.属性名=属性值;//添加了一个共有属性
②原型对象.方法名=function(){};//添加了一个共有方法
继承具有非常多的笔试题:
1、判断是自有还是共有:
①判断自有:obj.hasOwnProperty("属性名");
如果结果为true,说明是自有属性,如果结果为false,有两种可能,共有或没有
②判断共有:
if(obj.hasOwnProperty("属性名")==false && "属性名" in obj){//in 会自动在obj的原型上进行查找
共有
}else{
没有
}
公式:
if(obj.hasOwnProperty("属性名")){//false
console.log("自有")
}else{
if("属性名" in obj){
console.log("共有")
}else{
console.log("没有")
}
}
2、删除自有和共有
自有:修改:obj.属性名=新值;
删除:delete obj.属性名;
共有:修改:obj.共有属性名=新值; - 非常危险的,并没有修改到爸爸,而是在本地添加了一个同名属性
删除:delete obj.属性名; - 无效,本地本来就没有此自有属性
找到原型,修改/删除原型
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(this[i]==key){
return i;
}
}
return -1;
}
}
4、如何判断x是不是一个正则:4种方法:千万别用typeof,只能检查原始类型,不能检查引用类型
① 判断x是否继承自Array.prototype
Array.prototype.isPrototypeOf(x);
② 判断x是不是由Array这个构造函数创建
x instanceof Array;
③ Array.isArray(x); - ES5提供的,只是ES5+,老IE不支持,此方法只有数组
④ 输出对象的字符串形式
在Object的原型上保存着最原始的toString方法
原始的toString输出形式:[object 构造函数名]
多态:子对象觉得父对象的成员不好,在本地定义了同名成员,覆盖了父对象的成员
固定套路:借用:Object.prototype.toString.apply(x);
if(Object.prototype.toString.apply(arr)=="[object Array]"){
console.log("是数组")
}else{
console.log("不是数组")
}
5、实现自定义继承:
① 两个对象之间设置继承:
子对象.__proto__=父对象
② 多个对象之间设置继承:
构造函数名.prototype=父对象
时机:应该在开始创建对象之前设置好继承关系