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中Get和Set访问器的实现代码
Sep 19 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
Jun 24 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
表格展示利器 Bootstrap Table实例代码
Sep 06 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
原生js添加一个或多个类名的方法分析
Jul 30 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
简单了解Vue computed属性及watch区别
Jul 10 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
加强版phplib的DB类
2008/03/31 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
基于jquery的商品展示放大镜
2010/08/07 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
Vue实现简单分页器
2018/12/29 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
js实现简单音乐播放器
2020/06/30 Javascript
java直接调用python脚本的例子
2014/02/16 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
浅析Python中字符串的intern机制
2020/10/03 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
致跳高运动员广播稿
2014/01/13 职场文书
大学军训通讯稿
2014/01/13 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
先进员工获奖感言
2014/08/14 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python