JavaScript-入门第三周学习笔记5

一、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=父对象
                时机:应该在开始创建对象之前设置好继承关系    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值