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 相关文章推荐
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
Mar 03 Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
简单实例处理url特殊符号&处理(2种方法)
Apr 02 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
May 04 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
Mar 14 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
May 24 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 Javascript
JS 5种遍历对象的方式
Jun 16 Javascript
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 301转向实现代码
2008/09/18 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
详解JavaScript函数
2015/12/01 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
pandas 时间格式转换的实现
2019/07/06 Python
python如何实现异步调用函数执行
2019/07/08 Python
python求绝对值的三种方法小结
2019/12/04 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
财务人员个人自荐信范文
2013/09/26 职场文书
岗位明星事迹材料
2014/05/18 职场文书
意向书范本
2014/07/29 职场文书
医院合作意向书范本
2015/05/08 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang