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 相关文章推荐
Script的加载方法小结
Jan 12 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
微信小程序实现图片轮播及文件上传
Apr 07 Javascript
微信小程序 图片宽高自适应详解
May 11 Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 Javascript
用js简单提供增删改查接口
May 12 Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
vue+Element-ui实现分页效果
Nov 15 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php牛逼的面试题分享
2013/01/18 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
jQuery 技巧小结
2010/04/02 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
python连接字符串的方法小结
2015/07/13 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python使用tkinter实现简单计算器
2018/01/30 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
python进行参数传递的方法
2020/05/12 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
函授本科自我鉴定
2013/11/03 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
酒桌上的开场白
2015/06/01 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python