javascript 中关于function中的prototype
在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的更多相关文章
- 理解javascript中的Function.prototype.bind
在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...
- JavaScript中Function原型及其prototype属性的简单应用
大家都知道在JavaScript中是没有类的概念的,但是却是有对象的概念的.有的人可能理解对象和类有些迷糊,这里简单的概括一下他们之间的区别: 类:抽象的概念,例如人,动物,汽车等都可以抽象成一个类 ...
- 浅谈JavaScript中的Function引用类型
引言 在JavaScript中最有意思的就是函数了,这一切的根源在于函数实际上是一个对象.每一个函数都是Function类型的实例,而且都和其他引用类型的实例一样具有属性和方法.函数作为一个对象,因此 ...
- JavaScript中的Function(函数)对象详解
JavaScript中的Function对象是函数,函数的用途分为3类: 作为普通逻辑代码容器: 作为对象方法: 作为构造函数. 1.作为普通逻辑代码容器 function multiply(x, y ...
- 【JavaScript】关于JS中的constructor与prototype
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- 在AngularJS中学习javascript的new function意义及this作用域的生成过程
慢慢入门吧,不着急. 至少知道了controller和service的分工. new function时,隐含有用this指向function的prototype之意. 这样,两个JAVASCRIPT ...
- 深入理解javascript中的Function.prototye.bind
函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...
- javascript中的function命名空間與模擬getter、setter
function的命名空間 在javascript中,function也可以擁有自己的命名空間例如以下這段程式碼: 12345678 function () { return 'I am A';} A ...
- javascript中的function对象
function对象都是Function的实例: > Object.getOwnPropertyNames(Function) [ 'length', 'name', 'arguments', ...
随机推荐
- Android Studio Gradle's dependency cache may be corrupt Re-download dependencies and sync project (requires network)
转:Android studio 快速解决Gradle's dependency cache may be corrupt 和 Gradle配置 gradle-3.*-all.zip快速下载 Andr ...
- Web中的宽和高
不同的宽高定义 //网页可见区域宽 document.body.clientWidth //网页可见区域高 document.body.clientHeight //网页可见区域宽(包括边线和滚动条的 ...
- vue登录/查看/结束端口号
下班时间到啦! --下班都是他们的,而我,还是什么都没有. vue登录(未登录情况下不允许进入) 在路由里加上登录的权限 meta: { requireAuth: true, title: 'Logi ...
- 二. Jmeter--关联
1. 首先建立一个线程组(Thread Group),为什么所有的请求都要加入线程组这个组件呢?不加不行吗?答案当然是不行的.因为jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建 ...
- django【ORM】model字段类型
1.AutoField 一个自增的IntegerField,一般不直接使用,Django会自动给每张表添加一个自增的primary key. 2.BigIntegerField 64位整数, -922 ...
- gpk-update-icon占用CPU及清除【原创】
发现服务器有个gpk-update-icon一直占用CPU进程 网上查看相关信息比较少. gpk-update-icon是gnome的更新图标进程 俩种处理方法: 1.杀掉gpk-update-ico ...
- puppet practice
目标 试验环境有两台主机(VM)构成,一台是master,一台是agent,完成以下工作: 新建用户newuser; 安装 ubuntu-cloud-keyring package,更改文件/etc/ ...
- 设计模式之笔记--命令模式(Command)
命令模式(Command) 定义 命令模式(Command),将一个请求封闭为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排除或记录请求日志,以及支持可撤销的操作. 类图 描述 Comm ...
- centos7-sar工具的安装过程及其简单应用
一.sar工具安装 1.进入yum配置文件目录: cd /etc/yum.repos.d/ 2.vi CentOS-Base.repo命令创建文件CentOS-Base.repo 文件内容见网页:ht ...
- sed的额外用法(网摘)
#在我开始动手写一个一个的脚本的时候才会看到更多的用法 1. 在某行的前一行或后一行添加内容(前提是要确定行的内容) # 匹配行前加 sed -i '/allow/ideny' httpd.conf ...