js构造函数constructor和原型prototype原理与用法实例分析


Posted in Javascript onMarch 02, 2020

本文实例讲述了js构造函数constructor和原型prototype原理与用法。分享给大家供大家参考,具体如下:

所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)

所有函数拥有prototype属性(显式原型)(仅限函数)

原型对象:拥有prototype属性的对象,在定义函数时就被创建

__proto__, prototype和constructor

下面这三个属性的定义非常重要,始终贯穿在原型中。

  • prototype:此属性只有构造函数才有,它指向的是当前构造函数的原型对象
  • __proto__:此属性是任何对象在创建时都会有的一个属性,它指向了产生当前对象的构造函数的原型对象,由于并非标准规定属性,不要随便去更改这个属性的值,以免破坏原型链,但是可以借助这个属性来学习,所谓的原型链就是由__proto__连接而成的链。
  • constructor:此属性只有原型对象才有,它默认指回prototype属性所在的构造函数

构造函数的特点:

 a:构造函数的首字母必须大写,用来区分于普通函数

 b:内部使用的this对象,来指向即将要生成的实例对象

 c:使用New来生成实例对象

function定义的对象有一个prototype属性,使用new生成的对象就没有这个prototype属性(Person是一个对象)

Person是一个对象,它有一个prototype的原型属性(因为所有的对象都一prototype原型!)prototype属性有自己的prototype对象,而pototype对象肯定也有自己的construct(构造)属性,construct属性有自己的constructor(构造函数)对象,神奇的事情要发生了,这最后一个constructor对象就是我们构造出来的function函数本身

function Person(name){
 this.name=name;
 this.showMe=function(){
 alert(this.name)
 }
}
var one=new Person('js-yeluosen');
one.showMe();
console.log(one.prototype)//undefined
console.log(typeof Person.prototype)//Obiect
console.log(Person.prototype)
console.log(Person.prototype.constructor)

js构造函数constructor和原型prototype原理与用法实例分析

当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找

当函数对象本身的属性或方法与原型的属性或方法同名的时候:

    1、默认调用的是函数对象本身的属性或方法.
    2、通过原型增加的属性或方法的确是存在的.
    3、函数对象本身的属性或方法的优先级要高于原型的属性或方法.

function Hero(){
 this.name='jiangyx'
}
Hero.prototype.name="yeluosen"
var mm=new Hero()
// 当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找
alert(mm.name)//jiangyx
alert(mm.__proto__.name)//jiangyx
delete mm.name
alert(mm.name)//yeluosen
//创建构造函数
function Word(words){
  this.words = words;
}
Word.prototype = {
  alert(){
    alert(this.words);
  }
}
//创建实例
var w = new Word("hello world");
w.print = function(){
  console.log(this.words);
}
w.print(); //hello world
// 当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找
// w本身没有alert()方法,所以会去Word()的显式原型中调用alert(),即实例继承构造函数的方法。     
w.alert(); //hello world
// 实例w的隐式原型指向它构造函数的显式原型,指向的意思是恒等于
// w.__proto__ === Word.prototype

print()方法是w实例本身具有的方法,所以w.print()打印hello world;alert()不属于w实例的方法,属于构造函数的方法,w.alert()也会打印hello world,因为实例继承构造函数的方法。

实例w的隐式原型指向它构造函数的显式原型,指向的意思是恒等于

w.__proto__ === Word.prototype

总结

1、prototype只有构造函数才有,指向构造函数的原型。
2、__proto__任何对象都有,指向产生当前对象的构造函数的原型。
3、constructor只有原型对象才有,默认指回prototype属性所在的构造函数,使用原型链继承之后,要给新的原型对象添加constructor属性并指向构造函数。
4、任何对象都有产生自己的构造函数,包括构造函数自己。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JQuery autocomplete 使用手册
Apr 01 Javascript
js验证是否为数字的总结
Apr 14 Javascript
基于JQuery实现的Select级联
Jan 27 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
Feb 10 Javascript
JS实现页面打印功能
Mar 16 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
react-navigation之动态修改title的内容
Sep 26 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
vue路由缓存的几种实现方式小结
Feb 02 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 Javascript
微信小程序实现日历小功能
Nov 18 Javascript
Javascript节流函数throttle和防抖函数debounce
Dec 03 Javascript
原生js实现日历效果
Mar 02 #Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 #Javascript
详解Vue中的Props与Data细微差别
Mar 02 #Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 #Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 #Javascript
vue学习笔记之slot插槽用法实例分析
Feb 29 #Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 #Javascript
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
代码生成器 document.write()
2007/04/15 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
哪些是python中web开发框架
2020/06/17 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
暑期实践思想汇报
2014/01/06 职场文书
顶碗少年教学反思
2014/02/21 职场文书
根叔历年演讲稿
2014/05/20 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
护理专业自荐信范文
2015/03/06 职场文书
裁员通知
2015/04/25 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
python实现简单的聊天小程序
2021/07/07 Python