1.什么是prototype?

function F() {}
f1 = new F();
f2 = new F();

以上的代码,F()是一个构造函数,f1和f2是由这个构造函数产生的对象。

prototype是构造函数的一个属性,它的值就是由这个构造函数构造出来的对象的原型对象。(换句话来说,prototype既是构造函数的属性,也是由这个构造函数构造出来的对象的原型对象)

原型对象的属性和方法都会被“继承”,换句话来说,F.prototype的属性和方法都会被f1和f2“继承”。

2.什么是__proto__?它与prototype有什么区别?

__proto__是某个对象的属性,它指向这个对象的原型对象。从上面的例子分析,f1.__proto__和f2.__proto__就等同于F.prototype。

但是,我们一般不会直接访问__proto__这个属性,而是采用以下的方法去访问:

Object.getPrototypeOf(f1)
Object.getPrototypeOf(f2)

先用一张图总结一下上面的东西吧:

3.原型链

每个对象都有自己的原型对象,那一层层地,就形成了原型链。原型链的最上端,就是Object.prototype(注意这里的Object是一个构造函数啊),它没有原型对象(为null)。原型链后面的对象,能够使用前面的属性和方法(假如没有覆盖掉的话)。因此,有着相同原型对象的两个对象,就可以使用与原型对象相同的方法和属性了,这也是使用prototype的好处了。

4.constructor

prototype对象有一个constructor属性,F.prototype.constructor的值就是F本身。用文字描述,一个函数对象的原型对象的constructor属性指向这个函数本身。

利用这一点,我们可以进行判断一个对象是否由某个构造函数产生的。(利用这个例子来理解constructor属性吧)

function A(){};
var a = new A();
console.log(a.constructor===A) //true

分析一下以上的代码,a原本是没有constructor这个属性的,但是它的原型对象有,所以它“继承”了下来,自己也能使用这个属性。即a.constructor,其实也等于a.__proto__.constructor和A.prototype.constructor,而A.prototype.constructor的值,就是A,因此返回true了。

关于constructor的作用还有很多,这里不详述了。

5.总结

这篇文章只是谈谈我对prototype这东西的理解,供日后回看,因此写得很不详尽。更为详细的分析,包括它的作用,更多的分析,请看下面的网页:

http://www.jb51.net/article/91826.htm

假如不理解prototype和__proto__,下面的网页会更好地帮助理解:

http://blog.csdn.net/ligang2585116/article/details/53522741

对JS prototype的理解的更多相关文章

  1. 前端基本知识(三):JS的闭包理解

    JS闭包的理解 一.变量的作用域 二.如何从外部读取局部变量 三.什么是闭包 四.深入理解闭包 五.闭包的用途 六.使用闭包注意情况 七.JavaScript的垃圾回收机制 八.一些思考题 一.变量作 ...

  2. 前端基本知识(三):JS的闭包理解(第一个思考题有错误,已修改)

    JS闭包的理解 一.变量的作用域 二.如何从外部读取局部变量 三.什么是闭包 四.深入理解闭包 五.闭包的用途 六.使用闭包注意情况 七.JavaScript的垃圾回收机制 八.一些思考题 一.变量作 ...

  3. 37.js----浅谈js原型的理解

    浅谈Js原型的理解 一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了!    在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象    语言的小白来说,有理解不了里面 ...

  4. js面向对象怎么理解

    js面向对象怎么理解 <一>. 认识对象.首先要认识对象:在编程中,对象(object)是具体的某一个实例,唯一的某一个个体.如:电脑就是一个统称,而你面前的这一台电脑就是对象.而电脑的统 ...

  5. 关于 this 和 prototype 的理解

    1:this 的理解比较好的书是 <Javascript语言精粹> 平时我们全局写 var a = 1, 其实就是 window.a = 1; var f = function(){},  ...

  6. angular.js的一点理解

    对angular.js的一点理解 2015-01-14 13:18 by MrGeorgeZhao, 317 阅读, 4 评论, 收藏, 编辑 最近一直在学习angular.js.不得不说和jquer ...

  7. JS底层知识理解之执行上下文篇

    JS底层知识理解之执行上下文篇 一.什么是执行上下文(Execution Context) 执行上下文可以理解为当前代码的执行环境,它会形成一个作用域. 二.JavaScript引擎会以什么方式去处理 ...

  8. js prototype 原型

    //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E4% ...

  9. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

随机推荐

  1. bzoj 2120 带修改莫队

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 7340  Solved: 2982[Submit][Status][Discuss] ...

  2. Asp.Net Core2.0 基于QuartzNet任务管理系统

    Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https://www.quartz-scheduler.net/doc ...

  3. PHP安全、Sql防注入安全汇总

    利用Mysqli和PDO 产生原因 主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT ...

  4. PHP二维数组排序(感谢滔哥)

    滔哥原创 /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\|| ...

  5. network programming-简单的TCP客户服务器编程

    简单的TCP程序客户端流程:创建套接字(套接字用IP地址:端口号)表示)socket()->请求连接connect()->交换数据 send()/recv()->关闭连接 close ...

  6. SpringBoot中关于Mybatis使用的三个问题

    SpringBoot中关于Mybatis使用的三个问题 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html 原本是要讲讲PostgreSQL ...

  7. AES-256加密解密

    /// <summary> /// AES-256加密 /// </summary> /// <param name="toEncrypt">& ...

  8. 内置函数--bin() oct() int() hex()

    英文文档: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. ...

  9. Jenkins+Gradle实现android开发持续集成、打包

    Jenkins简介 Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误, ...

  10. Linux 系统裁剪笔记1

    1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统.下面,让我们来实现吧..写的不好 ...