在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. HDU 2827 高斯消元

    模板的高斯消元.... /** @Date : 2017-09-26 18:05:03 * @FileName: HDU 2827 高斯消元.cpp * @Platform: Windows * @A ...

  2. HDU 2920 分块底数优化 暴力

    其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...

  3. CSS 字体常用属性

    一.字体大小  font-size:参数 /** * 参数:一.数字固定值,如20px * 二.父元素字体的百分比 * 三.smaller 比父元素更小 * 四.larger 比父元素更大 * 五.i ...

  4. spring-boot支持websocket

    spring-boot本身对websocket提供了很好的支持,可以直接原生支持sockjs和stomp协议.百度搜了一些中文文档,虽然也能实现websocket,但是并没有直接使用spring-bo ...

  5. 【leetcode 简单】第四十题 求众数

    给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] 输出: 3 ...

  6. Java八种基本类型

    boolean 二进制位: true ,false   byte 二进制位:8 -128 - 127   -2的7次方到2的7次方-1 char 二进制位:16 0 - 65535   short 二 ...

  7. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  8. sqlite3_get_table()

    { sqlite3 *db; char *errmsg=NULL;    //用来存储错误信息字符串 char ret=0; int my_age=0;    //类型根据要提取的数据类型而定 cha ...

  9. Linux内核中的Cache段

    Linux内核中的Cache段 原文地址:http://blogold.chinaunix.net/u2/85263/showart_1743693.html 最近移植LEON3的内核时,了解了一些简 ...

  10. shell 监控磁盘使用率【转】

    方案一: disks=(`df |sed 1d | awk '{print $1,$5}'|tr -d %`) len=${#disks[@]} ;i<=$len;i=i+));do ];the ...