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校验价格合法性实例(必须输入2位小数)
May 05 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
详解JavaScript for循环中发送AJAX请求问题
Jun 23 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
读Javascript高性能编程重点笔记
Dec 21 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
JS正则表达式验证密码强度
Mar 18 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+JS+rsa数据加密传输实现代码
2011/03/23 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
浅谈php提交form表单
2015/07/01 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
javascript实现下雨效果
2017/03/27 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
Python循环语句之break与continue的用法
2015/10/14 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
纺织工程专业个人求职信范文
2014/01/27 职场文书
奶茶店创业计划书
2014/08/14 职场文书
离婚财产分割协议书
2015/08/11 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电