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 闭包 总结的更多相关文章

  1. js 原型链与继承

    var A = function(){ this.name="xiaoming"; } A.prototype.age=9; var a = new A(); console.lo ...

  2. JavaScript code 性能优化

    1 1 1 JavaScript 性能优化 prototype 闭包 Closure 内存泄漏 event system 1 定义类方法以下是低效的,因为每次构建baz.Bar的实例时,都会为foo创 ...

  3. js闭包 和 prototype

    function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...

  4. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  5. javascript闭包,arguments和prototype

    prototype javascript中一切皆对象,并且对象的属性和方法可以任意添加,例如: var obj=function(){}; obj.name="jack"; 但是下 ...

  6. javascript学习:闭包和prototype原型使用基础

    闭包 function Person(name) { this.Username = name; var Userage = 18; //通过这种方法可以模拟私有成员 //类似于private成员 t ...

  7. 【学习笔记】深入理解js原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  8. 深入理解javascript原型和闭包(3)——prototype原型 (转载)

    深入理解javascript原型和闭包(3)——prototype原型   既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...

  9. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

随机推荐

  1. 再次遇到\r\n转\r问题

    帮助小伙伴做jenkins的环境搭建.以为5分钟的事情,但是发现了一个诡异的问题.总是提示SVN的url不合法“URL '%s' is not properly URI-encoded”. 由于选择了 ...

  2. CUDA编程学习(一)

    /****c code****/ #include<stdio.h> int main() { printf("Hello world!\n); ; } /****CUDA co ...

  3. bt协议详解 DHT篇(上)

    bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...

  4. HoloLens开发手记 - Unity之摄像头篇

    当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...

  5. Django1.8教程——从零开始搭建一个完整django博客(一)

    第一个Django项目将是一个完整的博客网站.它和我们博客园使用的博客别无二致,一样有分类.标签.归档.查询等功能.如果你对Django感兴趣的话,这是一个绝好的机会.该教程将和你一起,从零开始,搭建 ...

  6. 鼠标滚动插件smoovejs和wowjs

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<图片ping.JSONP和CORS跨域> 作者主页:myvin 博主QQ:851399101(点击QQ ...

  7. Linq---左外联查询

    花了好半天才解决这个问题,终于在网上找到了答案,在此记录备份. 参考连接:http://bbs.csdn.net/topics/390150047 自己总结的如下: 结构就不说了,最后大家自己下源码看 ...

  8. WCF入门 (14)

    前言 上周去面试,跪了,这一年没什么长进,还是挺惭愧的. 得到的评语是:想的太多,做的太少. 做了一份面试题,最后一题是数据库的,写个查询.要查出Score有两次及两次以上超过79的Name和他的最高 ...

  9. No plugin found for prefix 'jetty' in the current project and in the plugin groups 【转】

    在maven进行jetty的调试中出现错误: [plain] view plaincopyprint? [ERROR] No plugin found for prefix 'jetty' in th ...

  10. 每天一个linux命令(8):cat 命令

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...