博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈__proto__和prototype的区别
阅读量:4305 次
发布时间:2019-06-06

本文共 1312 字,大约阅读时间需要 4 分钟。

  我想javascript中的原型链一直想很多初学javascript的同学感到非常的困惑,今天看了一些文章,结合自己的理解,把原型链这个东西从新来整理一下,如有不对之处,望大家帮忙指出。

  首先,我们应该认识的一个问题是,js中的继承是指对__proto__的继承,而不是prototype,这里有同学要问了:“那他们两个有么子区别呢?”,  请看官方的定义:

  1. A function's .prototype is actually the prototype of things made by it, not its prototype. 

  2. __proto__ is the actual prototype, but don't use it.  

  好吧, 我不知道它在说些事什么鸟东西。下面我们继续往下看,

   所有构造函数的__proto__都指向Function.prototype,它是一个空函数(Empty function)

alert(Number.__proto__ === Function.prototype);    //turealert(Number.__proto__);    //function Empty(){}

 还有些内置对象比如Math,JSON是以对象形式存在的,无需new。它们的__proto__是Object.prototype

alert(Math.__proto__ === Object.prototype);    //truealert(Math.__proto__);    //Object

 

上面的例子你可以

当然啦, 还有些构造函数可能是我们自己定义的,那么他们也是一样一样的

// 函数声明function Person() {}// 函数表达式var Man = function() {}console.log(Person.__proto__ === Function.prototype) // trueconsole.log(Man.__proto__ === Function.prototype)    // true

 

这说明什么呢?

所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身。所有构造器都继承了Function.prototype的属性及方法,如length、call、apply、bind(ES5)。

注意:Function.prototype本身是没有这些属性和方法的,他之所以可以调用这些方法是因为Function.prototype是一个对象,既然是一个对象就好说了,那么他的原型链指向的就会是Object.prototype了。

 

总的来说, 原型的所以知识点都可以用这么一张图来简单概括:

 

 通过上面这张图, 我们可以这样理解:

.prototype是一个对象的原型对象,而.__proto__则是对原型对象的引用!

 

 

 

转载于:https://www.cnblogs.com/MockingBirdHome/p/3360850.html

你可能感兴趣的文章
转换流
查看>>
序列化流
查看>>
线程池
查看>>
Junit单元测试
查看>>
Stream流思想和常用方法
查看>>
Stream流方法引用
查看>>
反射应用和获取Class对象的三种方式
查看>>
Spring框架
查看>>
JSP
查看>>
Session会话技术
查看>>
session案例之验证码
查看>>
数据导出生成word附件使用POI的XWPFTemplate对象
查看>>
页面调用系统window打印
查看>>
将给定数据源生成静态HTML页面持久化到项目之外的硬盘
查看>>
Spring全自动AOP和项目加入jar包
查看>>
AOP联盟通知类型和Spring编写代理半自动
查看>>
不同情况通知执行的顺序
查看>>
bean.xml配置数据源和读取配置文件配置数据源
查看>>
PHP正则表达式
查看>>
CSS 设计指南(第3版) 初读笔记
查看>>