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

JavaScript深入浅出

Bosn 资深架构师
难度中级
时长 5小时28分
学习人数
综合评分9.60
492人评价 查看评价
9.8 内容实用
9.5 简洁易懂
9.5 逻辑清晰
  • //接上 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('Link detection started.'); console.log('Scaning containers: '+this.containers); } Object.freeze(DetectorBase); Object.freeze(DetectorBase.prototype); Object.freeze(LinkDetector); Object.freeze(LinkDetector.prototype); Object.freeze(ContainerDetector); Object.freeze(ContainerDetector.prototype); Object.defineProperties(global,{ LinkDetector: {value: LinkDetector}, ContainerDetector: {value: ContainerDetector}, DetectorBase: {value: DetectorBase} }); }(this); var cd = new ContainerDetector('#abc #def #ghi'); var ld = new LinkDetector('http1 http2 http3'); cd.detect(); ld.detect();
    查看全部
  • !function(global){ function DetectorBase(configs){ if(!this instanceof DetectorBase){ throw new Error('Do not invoke without new.'); } this.configs = configs; this.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); } function inherit(subClass, superClass){ subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; }
    查看全部
  • 链式调用: 模块化: 模块化函数内部变量不会泄漏到全局作用域。 两种方法 1.定义立即执行函数 moduleA = function(){}(); 2.this 方法 moduleA = new function(){ var prop = 1; function func(){} this.func = func; this.prop = prop; }
    查看全部
  • 调用子类方法 子类调用被覆盖的父类方法: 父类.prototype.被覆盖函数名.apply(this, arguments); return this;//返回addClass实例 补充上条笔记:判断args 转换成布尔值 是否为true (非空判断);因为 typeof null = object
    查看全部
  • JS是弱类型,并且不强制参数个数,所以无法直接实现方法重载 需要通过arguments进行实现
    查看全部
  • 1、new + 构造器 这样会创建一个对象,这个对象的原型指向构造器的原型。例如:new Person 时需要 name, age ,在创建Person 实例作为 Stundent.prototype 时,传如何东西进去作为 name,age 都是很奇怪的。 2、实现继承的方式: Student.prototype = new Person(); Student.prototype = Object.create(Person.prototype); 推荐方法(ES5) 3、兼容性处理(模拟方法): if (!Object.create){ Object.create = function(proto){ function F(){} F.prototype = proto; return new F; } }
    查看全部
  • 1、函数的new 对象 指向 函数构造 的prototype ;及 函数构造的prototype为 new函数对象的 原型 2 用in的话,无论是对象上的属性,还是对象原型链的属性,都会被查找到,如果用hasOwnProperty()对象上的属性,不会向上查找。 hasOwnProperty 可以判段 某个属性 是否属于 我本身的对象(可排除原型链上的属性干扰)
    查看全部
    0 采集 收起 来源:prototype属性

    2015-08-24

  • 不允许遍历非本身的对象: //配置(configuarable)、枚举(enumerable)、可写(writable)这些属性都默认为false Object.definePrototype(Object.prototype, 'x',{writable:true, value: 1}); var obj = {}; for(var key in obj){ console.log('result' + key); } for(var key in obj){ //hasOwnProperty:判段某个属性是否属于本身的对象(可排除原型链上的属性干扰) if(obj,.hasOwnprototype(key)){ console.log('result' + key); } }
    查看全部
    0 采集 收起 来源:prototype属性

    2015-08-24

  • 1.修改类.prototype.属性时,会影响所有已经创建的实例,相当于修改静态变量; 但是直接修改类.prototype,赋值为新的对象时,并不会影响到已创建的实例,但是会对之后新创建的实例有影响。分别对应图中的第一、二、三部分。
    查看全部
    0 采集 收起 来源:prototype属性

    2015-08-24

  • 1.var obj = {x: 1}; Object.getPrototypeOf(obj);//返回对象的原型 Object.getPrototypeOf(obj) === Object.prototype //true 2.var obj2 = Object.create(null); obj2.toString(); //undefined 并不是所有的对象的原型链上都有Object.prototype 3.function abc(){} abc.prototype;//abc{} var bined = abc.bind(null);//bind修改运行时的this bined.prototype;//undefined bind没有prototype属性 并不是所有的函数都有prototype属性
    查看全部
    0 采集 收起 来源:再谈原型链

    2015-08-24

  • 大部分对象的原型链上都会指向Object.prototype
    查看全部
    0 采集 收起 来源:再谈原型链

    2015-08-24

  • 使用 Student.prototype = Object.create(Person.prototype); 来创建子类对象
    查看全部
    0 采集 收起 来源:再谈原型链

    2015-08-24

  • 1、function Foo(){} typeof Foo.prototype;//"object" Foo.prototype.x = 1; var obj3 = new Foo(); Foo函数有一个prototype的对象属性,它的作用是在当使用 new Foo()去构造父的实例时,Foo.prototype属性会作为new(构造)出来的对象的原型。prototype和原型是两回事,prototype是函数对象上预设的对象属性,而原型通常是obj3对象上的原型,指向构造器的prototype属性。 2、用一个function a()作为父类构造函数,并为该函数的prototype作为父类封装变量和方法,同时使用Object.create(a.prototype)继承,子类b可使用a.call(对象,参数)的方法来调用父类的构造函数并可重写父类的函数,需注意,重写时需写在b的prototype上,这样才是对象方法,否则直接写在b上则算作静态方法 注:call()第一个参数是被调用的对象!!
    查看全部
    1 采集 收起 来源:概念与继承

    2018-03-22

  • 1.作用域: for(var item in {a: 1, b:2}){ console.log(item); } console.log(item);//item still in scope js中没有块级作用域,在for()等里面定义的变量,在外面依然可以得到,所以item在外部也可以访问到 2.用new Function构造器是无法访问同级作用域的变量的 function outer(){ var i = 1; var func = new Function("console.log(typeof i)"); func();//undefined } outer(); 3.利用函数作用域封装: (function(){ //do sth here var a,b; })(); //利用匿名函数封装将函数内部的变量变为局部变量,而不是全局变量,防止大量的全局变量与类库或代码引发冲突 !function(){ //do sth here var a,b; }();//开头用!或+,作用是将函数变为函数表达式,而不是函数声明。如果省略!,以一个完整的function开头的话,它会理解为函数声明,这样就会被前置处理掉,那么就会留下一对(),会报语法错误
    查看全部
  • JavaScript中是没有块级作用域的,for(var i = 0;)这里面的i是全局变量----这就是对块级作用域的理解
    查看全部

举报

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

微信扫码,参与3人拼团

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

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