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 相关文章推荐
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
Jun 04 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
Apr 06 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
Feb 10 Javascript
javascript截取字符串小结
Apr 28 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
Sep 08 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
详解vue-cli项目中怎么使用mock数据
May 29 Javascript
vue的token刷新处理的方法
Jul 17 Javascript
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
js实现3D照片墙效果
Oct 28 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
php cookies中删除的一般赋值方法
2011/05/07 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
js实现无缝轮播图
2020/03/09 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python标准库sched模块使用指南
2017/07/06 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
python实现的发邮件功能示例
2019/09/11 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
企业管理培训感言
2014/01/27 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
电大本科自我鉴定
2014/02/05 职场文书
中学生运动会入场词
2014/02/12 职场文书
寄语学生的话
2014/04/10 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技