为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript深入浅出

Bosn 资深架构师
难度中级
时长 5小时28分
学习人数
综合评分9.60
492人评价 查看评价
9.8 内容实用
9.5 简洁易懂
9.5 逻辑清晰
  • 没有块级作用域

    var i=0;

    for(;i<10;i++){}

    for(var i=0;i<10;i++){}

    是一样的,变量i的声明是没有区别的

    查看全部
  • Typeof适合基本类型检测,遇到null失效

    [[Class]]通过{}.toString拿到,适合内置对象和基元类型遇到null和undefined失效

    instanceof适合自定义对象也可以用来检测原生对象,在不同iframe和window间失效

    查看全部
  • 不同window或iframe之间对象类型检测不能用instanceof

    查看全部
  • //函数前面加上!表示立即执行,如!function(global){}(this);传入this值作为形参global;
    
    !function(global){
        //定义基站的实例属性,用构造函数模式
        function DetectorBase(configs){
            if(!this instanceof DetectorBase){
                throw new Error('Do not invoke without new.');
            }
            this.configs=configs;
            this.analyze();
        }
    
        //定义基站的实例共享属性detect和analyze,用原型模式
        DetectorBase.prototype.detect=function(){
            throw new Error('Not implemented');
        };
        DetectorBase.prototype.analyze=function(){
            console.log('analyzing......');
            this.data='###data###';
        };
    
        //定义链接探测器的实例属性
        function LinkDetector(links){
            if(!this instanceof LinkDetector){
                throw new Error('Do not invoke without new.');
            }
            this.links=links;
            DetectorBase.apply(this,arguments);
        }
        //定义容器探测器的实例属性
        function ContainerDetector(containers){
            if(!this instanceof ContainerDetector){
                throw new Error('Do not invoke without new.');
            }
            this.containers=containers;
            DetectorBase.apply(this,arguments);
        }
    
        //让链接和容器探测器都继承基站的共享属性
        inherit(LinkDetector,DetectorBase);
        inherit(ContainerDetector,DetectorBase);
    
        //定义链接和容器探测器的实例共享属性
        LinkDetector.prototype.detect=function(){
            console.log('Loading data:'+this.data);
            console.log('Link detection started.');
            console.log('Scaning links:'+this.links);
        };
        ContainerDetector.prototype.detect=function(){
            console.log('Loading data:'+this.data);
            console.log('Container detection started.');
            console.log('Scaning containers:'+this.containers);
        };
        //冻结探测器的属性特性,以防被修改
        Object.freeze(DetectorBase.prototype);
        Object.freeze(DetectorBase);
        Object.freeze(LinkDetector);
        Object.freeze(LinkDetector.prototype);
        Object.freeze(ContainerDetector);
        Object.freeze(ContainerDetector.prototype);
    
        //将探测器方法变为global这个传入的全局变量的属性,可以将方法传出到全局环境中
        Object.defineProperties(global,{
            LinkDetector:{value:LinkDetector},
            ContainerDetector:{value:ContainerDetector},
            DetectorBase:{value:DetectorBase}
        });
    
        //继承方法
        function inherit(subClass,superClass){
            subClass.prototype=Object.create(superClass.prototype);
            subClass.prototype.constructor=subClass;
        }
    
    }(this);
    
    //全局环境下...
    var cd=new ContainerDetector("#abc #ddfe #fasdfa");
    var ld=new LinkDetector("http://www.baidu.com http://www.baidu.com http://www.baidu.com");
    cd.detect();
    ld.detect();
    console.log(cd.data);
    console.log(cd.containers);


    查看全部
  • 模块化,让内部变量不会跑到外面去。

    查看全部
  • defineProperty,定义属性

    查看全部
  • 链式调用: 用返回 return this,实现链式调用

    查看全部
  • 调用子类方法。

    查看全部
  • 模拟重载:对传入的参数值进行判断,然后再给与不同的执行方法。

    查看全部
  • 重载的概念,可以在类里写相同名字的方法,但有不同的类型和参数数量,实例化的对象可以通过不同的参数数量和不同类型来调用相对应的方法。

    查看全部
  • 原型链上有的,用instanceof就能返回true

    查看全部
    0 采集 收起 来源:instanceof

    2018-11-12

  • instanceof : 左边是一个对象,右边是一个函数。查看左边的对象,是否在右边函数的原型链中。

    查看全部
    0 采集 收起 来源:instanceof

    2018-11-12

  • 再记一次,hasOwnProperty检查属性是否在检查的对象上。

    查看全部
    0 采集 收起 来源:prototype属性

    2018-11-12

  • 动态改变原型的属性值,会影响已经存在实例化对象的属性值。动态改变原型的属性,相应已经实例化对象的对应属性值并不会改变。新实例化对象对应属性值会改变。

    查看全部
    0 采集 收起 来源:prototype属性

    2018-11-12

  • 基于原型链的继承演示图。

    查看全部
    0 采集 收起 来源:再谈原型链

    2018-11-12

举报

0/150
提交
取消
课程须知
1.您至少学习了本站“JS入门”、“JS进阶”两门基础课程。 2.如您具备一定实践经验对学习有很大帮助。 3.如您没有脚本编程开发经验,学习过程有可能会受挫部分内容或示例代码,请“暂时略过不懂的部分,后面章节会阐述”,当然想透彻学习,还需大量实践来体会知识的内涵。
老师告诉你能学到什么?
结合实例,深入解析以下知识内容: 1. 数据类型、表达式和运算符、语句; 2. 对象、数组、变量、函数; 3. this、闭包和作用域; 4. OOP; 5. 正则与模式匹配。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!