Javascript中prototype与__proto__的关系详解


Posted in Javascript onMarch 11, 2018

前言

学到原型的时候感觉头都大了/(ㄒoㄒ)/~~ 尤其是prototype和__proto__ 傻傻分不清  通过多番查找资料,根据自己的理解,总结如下:

一、构造函数:

构造函数:通过new关键字可以用来创建特定类型的对象的函数。比如像Object和Array,两者属于内置的原生的构造函数,在运行时会自动的出现在执行环境中,可以直接使用。如下:

var arr = new Array();//使用Array构造函数创建了一个array实例arr
arr[0]="a";
arr[1]="b";
alert(arr);//a,b

var obj=new Object();//使用Object构造函数创建了一个Object实例obj
obj.name="c";
obj.age=12;
alert(obj.name);//c

我们可以自定义的创建构造函数,并为其自定义属性和方法,如:

//创建构造函数Person
function Person(name,age){
 this.name=name;
 this.age=age;
 this.sayName=function(){
 alert(this.name)//
 };
}

//使用new关键字,来生成Person实例
var person1=new Person("Tom",22);
var person2=new Person("Jerry",21);
person1.sayName();//Tom
person2.sayName();//Jerry

注意以下几点:

  • 构造函数的名字始终要以大写字母开头(主要是为了区别于非构造函数,也即是区别于普通函数)
  • 构造函数也就是函数,定义构造函数和定义普通函数的语法一样。构造函数和普通函数的区别在于:使用他们的方式不同。任何函数只要使用new操作符来调用,那他就可以作为构造函数;不使用new操作符来调用就是普通函数
function Person(name,age){
 this.name=name;
 this.age=age;
 this.sayName=function(){
 alert(this.name)//
 };
}

//当做构造函数使用
var person=new Person("Tom",22);
person.sayName();//Tom 
//当做普通函数使用
Person("Jerry",30);//添加到window
sayName();//Jerry 等同于window.sayName();

二、原型对象:

每个函数都有一个prototype属性,它是一个指向原型对象的指针,原型对象在定义函数时同时被创建,原型对象的用途是包含所有实例共享的属性和方法

function Person(){
}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
 alert(this.name);
};
//原型对象中的所有属性和方法 都会自动被所有实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom

只要创建了一个新函数,每个函数在创建之后都会获得一个prototype的属性,这个属性指向函数的原型对象(原型对象在定义函数时同时被创建),此原型对象又有一个名为“constructor”的属性,反过来指向函数本身,达到一种循环指向,

如在上边的例子中:alert(Person.prototype.constructor===Person);//会返回true

function Person(){}
alert(Person.prototype.constructor===Person);//true

三、__proto__(注意这里proto左右两边都有两个"_")

当调用构造函数创建一个新实例后,该实例的内部将包含一个指针[[Prototype]],该指针指向创建它的构造函数的原型,在脚本上没有标准的方法来访问[[Prototype]],但大多数浏览器都支持通过__proto__来访问。

function Person(){
}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
 alert(this.name);
};
//原型对象中的所有属性和方法 都会自动被所有实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom
alert(person1.__proto__===Person.prototype);//true

以上述的示例代码为例,各个对象之间的关系如下图所示:

 Javascript中prototype与__proto__的关系详解

总结:

①只要创建了一个函数,该函数的原型对象也随之同时被创建出来,原型对象中的属性和方法被经由其相对应的构造函数所创建的实例所共享

②每个函数在创建之后都会获得一个prototype的属性,这个属性指向该函数的原型对象

③每个对象的__proto__属性都指向其构造函数的原型

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
Jan 17 Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 Javascript
jquery实现页面图片等比例放大缩小功能
Feb 12 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
JavaScript 自定义事件之我见
Sep 25 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
Sep 22 Javascript
jQuery实现图片切换效果
Oct 19 jQuery
js中document.write和document.writeln的区别
Mar 11 #Javascript
Javascript 编码约定(编码规范)
Mar 11 #Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 #Javascript
js经验分享 JavaScript反调试技巧
Mar 10 #Javascript
webpack打包node.js后端项目的方法
Mar 10 #Javascript
webpack external模块的具体使用
Mar 10 #Javascript
webpack组织模块打包Library的原理及实现
Mar 10 #Javascript
You might like
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
Vue.js教程之计算属性
2016/11/11 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
pandas 数据实现行间计算的方法
2018/06/08 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
Python使用folium excel绘制point
2019/01/03 Python
postman传递当前时间戳实例详解
2019/09/14 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
大学生个人求职信范文
2013/09/21 职场文书
村党支部换届选举方案
2014/05/02 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
服务整改报告
2014/11/06 职场文书
出国留学导师推荐信
2015/03/26 职场文书
小学生家长意见
2015/06/03 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android
MySQL 逻辑备份 into outfile
2022/05/15 MySQL