JS第三周——day5

80 阅读3分钟

1、面向对象

继承

父对象的成员(属性和方法),子对象可以直接使用

为什么继承:代码重用!节约内存空间!

何时继承:只要多个子对象公用的属性和【方法】,都应该集中定义在父对象中

JS的面向对象是基于原型(父对象)的

什么是原型:保存一类子对象共有属性和共有方法的原型对象(父对象)

1、如何去找到原型对象:

①对象名.__proto__ - 至少要创建一个对象才可以使用
②构造函数名.prototype
new 构造函数(Object RegExp Date Function String Number Boolean...)

2、在原型对象中添加共有属性和共有方法

原型对象.属性名=属性值
原型对象.方法名=function(){}

每一个对象都有一个.__proto__的属性指向着自己的原型

每一个构造函数都有一个.prototype属性指向着自己的原型

面试题:两链一包:

原型链:自己没有的属性和方法,可以顺着原型链一直向上找,直到最顶层:Object.prototype - 万物皆对象
作用:查找属性和方法

作用域链scope chain:以EC中的scope chain属性为起点,经过AO逐级引用,形成的一条链式结构,就称之为叫做作用域链
作用:查找变量

闭包:

自有和共有:

自有:保存在对象本地的

共有:保存在原型对象中的,子对象都可以直接使用

笔试题:

1、判断一个属性是自有还是共有:

①判断自有:

obj.hasOwnProperty("属性名");
    如果结果为true,说明是自有
    如果结果为false,可能是共有也可能是没有

②判断共有:2个条件

obj.hasOwnProperty("属性名")==false;//可能是共有也可能是没有
"属性名" in obj;//in关键字会查找自己的原型

if(obj.hasOwnProperty("属性名")==false && "属性名" in obj){
    console.log("共有")
}else{
    console.log("没有")
}

完整的:

if(obj.hasOwnProperty("属性名")){
    console.log("自有");
}else{
    if(obj.hasOwnProperty("属性名")==false && "属性名" in obj){
        console.log("共有")
    }else{
        console.log("没有")
    }
}

2、修改/删除属性

自有:

修改: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;
    }
}

比如:为一人添加共有方法

构造函数名.prototype.函数名=function(){
    this->函数中的代表当前调用此函数的对象
}

4、4、判断x是不是一个数组:4种

①判断当前x对象是否是继承自Array.prototype的

Array.prototype.isPrototypeOf(x);
    true说明是一个数组

②判断当前x对象是否是由此构造函数所创建

x instanceof Array
    true说明是一个数组

③Array.isArray(x); - 只有数组才有此方法
    true说明是一个数组

④在Object的prototype中保存着最原始的toString方法

原始的toString输出的结果:[object 构造函数名]

***多态:子对象觉得父对象提供的方法不好用,可以再本地定义一个同名成员,优先使用离自己更近的方法

同一个函数名,但根本不是同一个方法

固定套路:

if(Object.prototype.toString.apply(arr)==="[object Array]"){
			数组
}

⑤如何设置自定义继承

设置单个对象的继承:

obj.__proto__=新对象

设置多个对象的继承:

构造函数名.prototype=新对象

注意时机:在创建对象之前就设置好父对象