在javascrpit中每个函数中都有一个prototype属性,在其创建的时候,无论是用var method = function(){}或者 var method = new Function()或者function method(){}三种方法中哪一种方法去创建这个变量,其中都会自带有prototype属性。prototype属性是一个对象,其中默认会含有constructor属性。该属性是指向函数本身的一个指针。

  向上面定义的method方法,如果该方法时一个构造函数,那个用该构造函数创建的新的对象:如 var m = new method();(一般构造函数首字母为大写以示区分,这里忽略)。那么该m中有一个指向原型的指针[_proto_],这个指针直接是访问不到的,需要通过Object.getPrototypeOf()方法去访问,亦或通过m.constructor.prototype去访问。

  比如在method.prototype中定义一个方法,method.prototype.sayHello = function(){alert("hello");};。那么新对象m中也可以直接调用这个方法。m.sayHello();这时候会弹出警告框hello。每个对象中属性查询的顺序是先查找对象本身中有没有该属性,如果没有,就会查找该对象的原型,原型的原型,直至最顶层的Object或者找到该属性为止,如果没找到则会返回undefined。这里就可以理解上面通过m.constructor.prototype去访问自己构造函数prototype的原理了。m本身中是没有constructor这个构造函数指针的,所以会去查找m的[_proto_]所指向的原型中有没有constructor。有因为m的[_proto_]是指向method.prototype,那么肯定包含constructor指针指向method本身,而prototype又是method中的属性,所以绕几个弯以后就可以访问到[_proto_]所指向的原型对象了。

  这里值得注意的是如果一个对象是Function类型的,那么本身包含的prototype和[_proto_]是完全不同的两个概念。还是按照上面举的例子来说,关于这个method对象,如果是method.constructor,那么指向的就是Function,如果是method.prototype.constructor ,那么指向的就是method本身。method.constructor.prototype = Function.prototype 。所以说method.prototype.constructor和method.constructor.prototype是完全不同的两个概念,虽然只是顺序不同。这里Function.prototype还是一个function类型的对象,其中我们常用的arguments,call,apply,caller这些都是在这个function对象里面所定义的。

javascript 中关于function中的prototype的更多相关文章

  1. 理解javascript中的Function.prototype.bind

    在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...

  2. JavaScript中Function原型及其prototype属性的简单应用

    大家都知道在JavaScript中是没有类的概念的,但是却是有对象的概念的.有的人可能理解对象和类有些迷糊,这里简单的概括一下他们之间的区别: 类:抽象的概念,例如人,动物,汽车等都可以抽象成一个类 ...

  3. 浅谈JavaScript中的Function引用类型

    引言 在JavaScript中最有意思的就是函数了,这一切的根源在于函数实际上是一个对象.每一个函数都是Function类型的实例,而且都和其他引用类型的实例一样具有属性和方法.函数作为一个对象,因此 ...

  4. JavaScript中的Function(函数)对象详解

    JavaScript中的Function对象是函数,函数的用途分为3类: 作为普通逻辑代码容器: 作为对象方法: 作为构造函数. 1.作为普通逻辑代码容器 function multiply(x, y ...

  5. 【JavaScript】关于JS中的constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  6. 在AngularJS中学习javascript的new function意义及this作用域的生成过程

    慢慢入门吧,不着急. 至少知道了controller和service的分工. new function时,隐含有用this指向function的prototype之意. 这样,两个JAVASCRIPT ...

  7. 深入理解javascript中的Function.prototye.bind

    函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...

  8. javascript中的function命名空間與模擬getter、setter

    function的命名空間 在javascript中,function也可以擁有自己的命名空間例如以下這段程式碼: 12345678 function () { return 'I am A';} A ...

  9. javascript中的function对象

    function对象都是Function的实例: > Object.getOwnPropertyNames(Function) [ 'length', 'name', 'arguments', ...

随机推荐

  1. Ping命令网络监测

    按照由近到远原则: 1. ping 127.0.0.1 先检查TCP/IP协议栈是否正常. 2. ping 本地ip 检查网卡是否工作正常. 3. ping 网关地址 检查和网关连接性. 4. pin ...

  2. Google guava 中的Monitor

    synchronized 自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码.Java提供了同步关键字synchronized来实 ...

  3. MySQL异常总结

    1.Packets larger than max_allowed_packet are not allowed MySQL的一个系统参数:max_allowed_packet,其默认值为104857 ...

  4. Stat2—主成分分析(Principal components analysis)

    最近在猛撸<R in nutshell>这本课,统计部分涉及的第一个分析数据的方法便是PCA!因此,今天打算好好梳理一下,涉及主城分析法的理论以及R实现!come on…gogogo… 首 ...

  5. callee与caller

    1.callee arguments.callee表示当前函数,使用于递归 function factorial(num){ if(num<=1){ return 1; }else{ retur ...

  6. 对RSA的认识

     #没有经过专业老师的指导,所以您在阅读本文时建议参考即可. 学习视屏:https://www.youtube.com/watch?v=TqX0AHHwRYQ   https://www.youtub ...

  7. Java访问http用户验证

    public class SAXParse { static final String kuser = "admin"; static final String kpass = & ...

  8. Photon3Unity3D.dll 解析三——OperationRequest、OperationResponse

    OperationRequest 代表Operation操作的Request,包含Code和Parameters OperationCode  Byte类型的值,代表操作,由LiteOpCode定义了 ...

  9. NTP算法

    网络时间协议 由特拉华大学的David L. Mills热心提供.http://www.eecis.udel.edu/~mills mills@udel.edu 由Reinhard v. Hanxle ...

  10. 关于真多核和加多核&线程由哪几部分组成

    网上查的资料小结,没有考证. 真多核是指一个cpu多个核心,即多个内核. 假多核是指多个cpu捆绑形成的分布式计算,ARM针对服务器市场推出的处理器为多个cpu的 真多核的应用奔腾和因特尔 双核芯cp ...