索鸟网

  1. 首页
  2. 深入理解javascript原型和闭包

深入理解javascript原型和闭包


    函数就是对象的一种,因为通过instanceof函数可以判断。函数就是对象的一种,因为通过instanceof函数可以判断。

var fn = function () { };
 console.log(fn instanceof Object);  // true

   对!函数是一种对象,但是函数却不像数组一样——你可以说数组是对象的一种,因为数组就像是对象的一个子集一样。但是函数与对象之间,却不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻辑,咱们这一节就缕一缕。

 function Fn() {             
     this.name = "王福朋";            
     this.year = 1988;         
}        
     var fn1 = new Fn();

上面的这个例子很简单,它能说明:对象可以通过函数来创建。对!也只能说明这一点。

但是我要说——对象都是通过函数创建的——有些人可能反驳:不对!因为:

var obj = { a: 10, b: 20 }; 
var arr = [5, "x", true];
但是这只是创建对象的一种快捷方式,其内部依然会通过new Object() 去创建 

所以,可以很负责任的说——对象都是通过函数来创建的

现在是不是糊涂了—— 对象是函数创建的,而函数却又是一种对象——天哪!函数和对象到底是什么关系啊?

下面我们要去了解一下prototype原型对象

函数也是一种对象。他也是属性的集合,你也可以对函数进行自定义属性。

不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype。对,每个函数都有一个属性叫做prototype。---函数原型对象

这个prototype的属性指向一个对象,就是原型对象,默认有一个constructor 属性指向构造函数


function Fn() {}
    Fn.prototype.name = "zhangsan";
    Fn.prototype.getName = function () {
      return name;
    }
    var f1 = new Fn()
    console.log(f1)


每个对象都有一个隐藏的属性——“__proto__”,这个属性引用了创建这个对象的函数的prototype。

这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值。所以你在Visual Studio 2012这样很高级很智能的编辑器中,都不会有__proto__的智能提示,但是你不用管它,直接写出来就是了。

每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。

自定义函数的prototype本质上就是和var obj = {} 是一样的,都是被Object创建,所以它的__proto__指向的就是Object.prototype。




来源地址:http://blog.csdn.net/code_biubiu/article/details/78231929 版权归作者所有!

相关教程

  • javascript深入理解js闭包

    一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 Js代码   var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面,在函数外部自
  • javascript深入理解js闭包

    一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 Js代码 var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面,在函数外部自然无法读
  • 深入理解JavaScript (5) —— 闭包

    理解了上下文环境、作用域、作用域链以及自由变量,我们再来聊聊闭包。 我们不急于给出闭包的概念,先从应用闭包的两种情况 —— 1.函数作为返回值,2.函数作为参数被传递 —— 来直观的认识它。 第一,函数作为返回值 function fn() { var max = 10; return function bar(x) {
  • JavaScript深入之闭包

    JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。 由此,我们可以看出闭包共有两部分组成: 闭包 = 函数 + 函数能够访问的自由变量
  • Javascript闭包的理解

    闭包: 白话:我们可以用一个函数去访问另一个函数内部变量的方式就是闭包。 总结: 获取节点对象时用的方法,有时是单个元素,有时是集合,尤其注意得的是集合的时候,相对某个具体元素操作的时候,需要再后面加上索引 排他思想,先全部处理,再给特殊对象(包括事件源和事件源相关对象)添加特殊效果。 当使用循环为集合里的每个元素绑定事件监听时,i的值一定是在循环结束时,达到最大+
  • javascript 之 闭包理解

    闭包在 JavaScript 中常用来实现对象数据的私有,在事件处理和回调函数中也常常会用到它,此外还有偏函数应用(partial applications)和柯里化(currying),以及其他函数式编程模式。 什么是闭包? 简言之,闭包是由函数引用其周边状态(词法环境)绑在一起形成的(封装)组合结构。在 JavaScript 中,闭包在每个函数被创建时形成。 这是基
  • js之深入理解闭包问题。

    最近一段时间准备好好学习下机器学习,所以了解了很多机器学习方面的知识。抓紧补救了下自己曾经遗忘的理论知识(高数、统计学、概率论、微积分等),发现还有点吃力了,很多东西都快忘得差不多。不过,咱程序员,还是很擅长围魏救赵滴^_^。所以,我果断的选择边理论边着手老本行——编程。 选择语言问题,就是第一大难题。 目前流行的机器学习语言大抵是R语言和python了,熟悉了下R,发
  • 深入贯彻闭包思想,全面理解JS闭包形成过程

    写这篇文章之前,我对闭包的概念及原理模糊不清,一直以来都是以通俗的外层函数包裹内层....来欺骗自己。并没有说这种说法的对与错,我只是不想拥有从众心理或者也可以说如果我们说出更好更低层的东西,逼格会提升好几个档次。。。 谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至可以说它们是衡量js工