this prototype 闭包 总结
this对象
整理下思路:
一般用到this中的情景:
1.构造方法中
function A(){
this.name="yinshen";
}
var a=new A();
console.log(a.name);
this指向new出来的对象实例
2.json对象中方法:
var obj={
name:"yinshen",
getName:function(){
return this.name;
}
}
this指向obj本身
3.通过apply或call方法改变方法本身作用域对象
function a(){
return this.name;
}
var b={name:"yinshen"};
a.apply(b);
this指向apply/call的传入的参数对象。
4.其它:其它情形纯属没事找抽型,可以就地正法
prototype
从物种起源说起吧:js创建一个对象必须有构造方法,我们取名为A函数,var a=new A()之后有了a对象。
对象a默认有什么属性?
a有constructor属性指向A函数,constructor的用处在于标识对象类型
alert(a.constructor==A);
alert(a instanceof A);
但说实话,js一般使用我们不关心对象是什么类型,我们关心他实际能做什么(属性和方法),你可以忘掉这个constructor了,除非你的场景真要做类型判断。。。
a有个__proto__属性指向原型对象,在高级浏览器支持。firefox、chrome有,IE不兼容。这属性有什么实际用处?继续忘掉吧,除了调试的时候打印出来看看。。。
函数A默认有什么属性?
A有prototype属性,prototype是个对象:所有A的实例共享此prototype的方法和函数。
用处很多:
你可以将公共的方法和公有的变量设置到prototype上,达到复用函数和属性的目的。不过要注意些问题:
1.prototype设置方法没疑问,但设置属性时,特别是数组或者obj的引用类型变量时要小心覆盖影响的问题。
A.prototype.friends=["b","c","d"];
var a1=new A();
var a2=new A();
a.friends.push("e");
alert(a2.friends);
2. A的prototype的constructor默认指向A,但prototype如果直接赋值给一个对象,会覆盖constructor,不过像之前所说很多时候我不care这个,那就忽略吧,类型判断出了问题再记起这个坑
A.prototype.getName=function(){};//不会覆盖constructor
//会覆盖constructor
A.prototype.construct={
constructor:A,//可以这样
getName:function(){}
}
3.for in 操作a对象时会遍历出所有属性或方法,包括prototype上的,可以通过a.hasOwnProperty("name")来判断(true为自身,false为prototype)
终了画张图上来:

对象person1的constrcutor指向Person函数,person1的__proto__指向Person函数的prototype
Person函数的prototype对象的constructor属性指向Person自身
上张更经典的图吧

闭包
引入问题
(function a(){
var i=1;
for(;i<10;i++){
(function(){
console.log(i);
})();
}
})()
输出:0,1,2....9 这个正常
var result=(function a(){
var i=1,fn=[];
for(;i<10;i++){
fn[i]=function(){
console.log(i);
};
}
return fn;
})();
console.log(result[1]());....console.log(result[9]());
输出是:10,10,10,..... 这里有问题
梳理下基础:
1.javascript的变量最小作用域是方法级。(方法里面嵌入方法)
2.javascript的作用域链是嵌套的,内部方法可以访问到外部方法定义的变量。(且内部方法依赖外部变量)
3.函数是个很特殊语言类型,它不会立即执行,函数中的变量只有当函数真正执行的那一刻才能确认。(方法返回内部方法。。。闭包)
上面的几点导致js可能存在的闭包问题:如果内部找不到i变量会在作用域链中回溯上一级,但它并不会实际保存i的值,它只是在内部记得自己引用的是外层的i变量,但这个i变量可能在函数执行时已经被改变了。这个过程对内部函数不可知。
除了自己显式的这种闭包调用,另外一个比较隐藏的情况就是setTimeout和setInternval,因为实际上原理是一样的,细细体会吧
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i)
},10);
}
4.推荐的解决:内部函数若依赖外部的变量,以方法调用的值传递来解除这种闭包的依赖。
var result=(function a(){
var i=1,fn=[];
for(;i<10;i++){
fn[i]=(function(_i){
return function(){console.log(_i)};
})(i);
}
return fn;
})();
console.log(result[1]());....console.log(result[9]());
this prototype 闭包 总结的更多相关文章
- js 原型链与继承
var A = function(){ this.name="xiaoming"; } A.prototype.age=9; var a = new A(); console.lo ...
- JavaScript code 性能优化
1 1 1 JavaScript 性能优化 prototype 闭包 Closure 内存泄漏 event system 1 定义类方法以下是低效的,因为每次构建baz.Bar的实例时,都会为foo创 ...
- js闭包 和 prototype
function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- javascript闭包,arguments和prototype
prototype javascript中一切皆对象,并且对象的属性和方法可以任意添加,例如: var obj=function(){}; obj.name="jack"; 但是下 ...
- javascript学习:闭包和prototype原型使用基础
闭包 function Person(name) { this.Username = name; var Userage = 18; //通过这种方法可以模拟私有成员 //类似于private成员 t ...
- 【学习笔记】深入理解js原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- 深入理解javascript原型和闭包(3)——prototype原型 (转载)
深入理解javascript原型和闭包(3)——prototype原型 既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
随机推荐
- Linux第八次学习笔记
系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. I/O→主存 输出操作是从主存拷贝数据到I/O设备. 主存→I/O Unix I/O ...
- (转)shell实例手册
原文地址:http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9 实在是太好的资料了,不得不转 shell实例手册 0说明{ 手册制 ...
- EntityFramework:值不能为 null。参数名: entitySet 异常解决方案
昨天EF莫名其妙的,掉所有接口访问都出现如下错误:百度,Google了半天,倒是有很多人都遇到了这个问题,但都没有一个解决方案,或者解决方案无效.通过层层排除,终于找到问题的所在.记录下来,给以后再遇 ...
- IT男的”幸福”生活"续9
世界上最容易失去的便是时间了,我们总是蓦然回首,而时间早已流去. 曾经的种种,时时刻刻在我们脑中出现,让我们感到开心,快乐,幸福等. 有时好想有一种动冲,回到过去,再感受一下心中的那份触动. 又一年过 ...
- Linux下硬盘安装Windows系统。
注意:本方法安装后会把Linux系统损坏,方法适用于完全不再需要Linux系统. 本方法在ubuntu 14.04,centos 6.5,debian 8测试成功. 安装方法是通过grub2引导Win ...
- onload是代码在也买你的追加元素的完成,而不是http请求的完成
- [工具类]DataTable与泛型集合List互转
写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中 ...
- HOW TO REMOTELY DEBUG APPLICATION RUNNING ON TOMCAT FROM WITHIN INTELLIJ IDEA
This post would look into how to tackle and debug issues in scenarios where they only occur in produ ...
- 每天一个linux命令(28):diff 命令
diff 命 令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版 本的diff还支持二进制文件.diff程 ...
- Eclipse自动生成UML图(转载)
*ModelGoon是什么? 它是一个Eclipse插件,用于基于UML图的模型设计,以及逆向工程(即从已有源代码生成类图等,以作为代码分析或者文档使用). *适用条件 ModelGoon目前最新的版 ...