-
//接上 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 可以判段 某个属性 是否属于 我本身的对象(可排除原型链上的属性干扰)查看全部
-
不允许遍历非本身的对象: //配置(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); } }查看全部
-
1.修改类.prototype.属性时,会影响所有已经创建的实例,相当于修改静态变量; 但是直接修改类.prototype,赋值为新的对象时,并不会影响到已创建的实例,但是会对之后新创建的实例有影响。分别对应图中的第一、二、三部分。查看全部
-
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属性查看全部
-
大部分对象的原型链上都会指向Object.prototype查看全部
-
使用 Student.prototype = Object.create(Person.prototype); 来创建子类对象查看全部
-
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.作用域: 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
提交
取消