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 相关文章推荐
javascript:void(0)的真正含义实例分析
Aug 20 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
juqery 学习之六 CSS--css、位置、宽高
Feb 11 Javascript
Knockoutjs的环境搭建教程
Nov 26 Javascript
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
代码详解Vuejs响应式原理
Dec 20 Javascript
Vue Router去掉url中默认的锚点#
Aug 01 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 Javascript
JS实现炫酷雪花飘落效果
Aug 19 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
提取HTML标签
2006/10/09 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
PHP防盗链代码实例
2014/08/27 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
Python读写配置文件的方法
2015/06/03 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
机关党员公开承诺书
2014/08/30 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
房产分割协议书范文
2014/11/21 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android