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 相关文章推荐
用JS实现3D球状标签云示例代码
Dec 01 Javascript
深入分析jquery解析json数据
Dec 09 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
JS实现霓虹灯文字效果的方法
Aug 06 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
Jan 04 Javascript
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
Dec 07 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
Nov 07 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
JS实现电商商品展示放大镜特效
Jan 07 Javascript
微信小程序实现签到弹窗动画
Sep 21 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 和 MySQL 基础教程(三)
2006/10/09 PHP
PHP下MAIL的另一解决方案
2006/10/09 PHP
PHP关联链接常用代码
2012/11/05 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
StringBuilder和String的区别
2015/05/18 面试题
IBatis持久层技术
2016/07/18 面试题
自我评价的写作规则
2014/01/06 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
烈士陵园观后感
2015/06/08 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
Python代码实现双链表
2022/05/25 Python