原生js中的函数有三种角色:

分两大种:
1、函数(最主要的角色)
2、普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系
两种角色直接没有必然的关系;
分三小类:

1、普通函数

function fn(){

 console.log('我是一个最基础的函数');
} fn();


2、类
包括(内置类,自定义类)也就是 构造函数 

     内置类是通过构造函数的形式创建的

     自定义类形式和内置类一样创建

内置类的使用:其实上述fn函数就是内置Function类的一个实例,可以使用内置函数类的原型上的方法,下面的代码只是更加形象的表现了函数是类的角色而已
var fn2=new Function('a','b','c','return a+b');
console.log(fn2.constructor);//指向当前实例所属类本身,控制台输出:ƒ Function() { [native code] }
console.log(fn2);

fn2.call(null);

fn2 输出结果,是一个匿名函数,a,b,c,分别是作为函数的参数,'return a+b'是作为函数体,如截图:

fn2是内置类Function的一个实例,可以通过__proto__原型链使用prototype原型上的call方法;

自定义类的使用:

    function fn3() {
var stack='我是fn3的私有的';
this.name='我是实例私有的';
}
fn3.prototype.sum=function(){
     console.log('执行了sum');
   }
var f=new fn3;
    console.log(f.constructor);//控制台输出fn3函数体
    console.log(f.name);//我是实例私有的,每个fn3的实例都拥有
    console.log(f.stack);//undefined,属于fn3自己的私有属性,实例不可以使用

    f.sum();//执行了sum , sum属于f的所属类的原型上的公有方法,作为fn3的实例都可以调用


3、普通对象
和普通的object没有区别,就是对键值对的增删改查
 function fn(){
}
fn.aa='ok';//把fn当成普通对象键值对方式
jquery这个类库中,有一部分方法就是写在原型上的,有一部分是按照普通对象来设置的:

(function (g,f) {

        var version = "1.11.3",
jQuery=function(){//把jquery当成构造函数 return new jQuery.fn.init( selector, context );//new 原型上的init,就是new jQuery
         }; 

  jQuery.fn = jQuery.prototype = { //把jquery当成一个函数对象添加了fn属性名=把jquery的原型重新赋值了
  jquery: version,// 添加了jQuery版本键值对 
  constructor: jQuery,//重新补写了constructor属性,值为jquery,更加说明jquery是一个自定义类(构造函数)
  jQuery.extend = jQuery.fn.extend = function() { //将扩展的对象插入到指定的对象中 //实现两种调用方法,对象.xxx, 实例调用  };

  var init = jQuery.fn.init = function( selector, context ) { var match, elem;return jQuery; })()//init是jQuery.fn原型上的一个属性 
  init.prototype = jQuery.fn;//init 的原型指向了jQuery.fn , jQuery.fn又是jQuery的原型,所以在起初才能使用 new jQuery.fn.init的写法

  $.ajax();//把jquery当成对象 

  $().css();//把jquery当成构造函数(类),实例.css()->实例调用原型上的css方法

只要是个函数,不管哪个角色,永远都是内置Function这个类的实例

关于原生js中函数的三种角色和jQuery源码解析的更多相关文章

  1. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  2. android Service Activity三种交互方式(付源码)(转)

    android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread  android Service Binder交互通信实例 最下边有源代码: ...

  3. Java的三种代理模式&完整源码分析

    Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...

  4. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  5. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  6. 三.jQuery源码解析之jQuery的框架图

    这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...

  7. js便签笔记(9)——解读jquery源码时记录的一些知识点

    近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...

  8. 神经网络中 BP 算法的原理与 Python 实现源码解析

    最近这段时间系统性的学习了 BP 算法后写下了这篇学习笔记,因为能力有限,若有明显错误,还请指正. 什么是梯度下降和链式求导法则 假设我们有一个函数 J(w),如下图所示. 梯度下降示意图 现在,我们 ...

  9. MapReduce中一次reduce方法的调用中key的值不断变化分析及源码解析

    摘要:mapreduce中执行reduce(KEYIN key, Iterable<VALUEIN> values, Context context),调用一次reduce方法,迭代val ...

随机推荐

  1. python-if条件判断与while/for循环

    条件判断if 让计算机像人一样,能判断是非对错,根据条件做一些事情. if ''' ------ if代码结构:------- if 条件: 代码体 tips:同一缩进范围内的代码被视作同一代码体,p ...

  2. 《VR入门系列教程》之21---使用Unity开发GearVR应用

    使用Unity开发GearVR应用     上一章我们介绍了如何运用Unity3D开发Oculus Rift应用,当然,这个便宜且强大的游戏引擎也可以用于GearVR的应用开发,这时我们需要用到Ocu ...

  3. 【Arduino】66种传感器模块系列实验(2)---光敏电阻模块

    实验二:光敏电阻传感器模块我手里这块是三针版的,挺秀气吧 光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应.光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低, ...

  4. containsObject 总是不含有,你会用吗

    结论:containsObject:是在比较内存地址,即使两个对象内容完全一样,地址不同,那也是不同的.我个人认为这个方法应该叫是否存在同一个对象 (开始不知道这个知识,被坑,至少浪费了3个钟头,数组 ...

  5. 【Sublime】设置显示编码格式

    Mac 上的 Sublime 显示编码格式,设置方法: 右下角显示的 UTF-8 就是当前的编码格式. 添加如下代码: { "font_size": 18, // Display ...

  6. Consul和Kong的实践(一)

    Consul和Kong的实践(一) 这一篇先介绍consul集群,以及consul和应用服务的结合使用,下一篇是和kong网关的结合. 一.Consul的集群安装 以其中一台机器为例: mkdir / ...

  7. 【pycharm】pycharm远程连接服务器的Python解释器,远程编写代码!!!

    今天讲讲如何用pycharm连接远程服务器,使用远程服务器的Python解释器,比如说是你公司的服务器,在家里就可以编写或修改项目的代码! 第一步,先找到服务器上的ip地址 Linux查看IP命令:i ...

  8. 小伙子,你真的清楚 JVM GC ?

    序 正文 如何确定垃圾? 前面已经提到 JVM 可以采用 引用计数法 与 可达性分析算法 来确定需要回收的垃圾,我们来具体看一下这两种算法: 引用计数法 该方法实现为:给每个对象添加一个引用计数器,每 ...

  9. 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...

  10. [Chat]实战:仿网易云课堂微信小程序开发核心技术剖析和经验分享

    本Chat以一个我参与开发并已上线运营近2年——类似网易云课堂的微信小程序项目,来进行微信小程序高级开发的学习. 本场Chat围绕项目开发核心技术分析,帮助你快速掌握在线视频.音频类小程序开发所需要的 ...