关于prototype与constructor的几点理解
首先要明确一点,js中的prototype是每个函数创建时(并非执行时,而是函数存在于堆区后)自动创建一个默认对象,这一对象中可以动态的添加属性
在new对象后,可以通过“对象.属性名”的方式直接调用prototype对象中的属性
但是,注意,prototype对象只在函数中存在(函数本身也是一个对象,可以具有属性/方法),通过构造函数创建的对象中不存在原型对象属性,而是存在一个指针,通常被命名为_proto_,这个并不是一个值为原型对象的属性,因此在new的对象中也无法访问。
constructor又是什么呢?
字面意思:构造器
function a(){
this.age=12;
}
console.log(a.prototype) // { constructor : a() }
从打印出来的原型对象中可以看出,constrcutor是存在于原型对象中的一个属性,值为一个函数(此函数默认指向原型对象所属函数)
那么,问题来了:new是根据构造函数来创建对象,已经有了a()函数,为什么多此一举添加一个constructor属性呢?
我们打印一下constructor
console.log(a.prototype.constructor) // a()
也就是说constructor属性值中并不存在已经得以好的a()函数已经定义好的age属性,想想也对age在new之前是属于window对象的属性,凭啥要回出现在构造函数中
实际上,new对象的过程大致是这样的:
首先编写一个函数,代码在被js引擎解析后函数存入堆区
解析到new语句时,先提取函数的prototype对象,根据原型对象中的constructor属性创建函数的对象
然后,创建new出来的对象与prototype对象的链接(在new出来的对象中添加一个指针)
最后,将a()函数中定义的属性复制一个副部给new出来的对象
关于prototype与constructor的几点理解的更多相关文章
- js中prototype,constructor的理解
连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...
- prototype 以及 constructor 属性的理解
1 为什么 xx.constructor.prototype 可以访问到当前对象的原型. 'str'.constructor.prototype 'str'.constructor 指向当前 ...
- javascript中prototype、constructor以及__proto__之间的三角关系
三者暧昧关系简单整理 在javascript中,prototype.constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备 ...
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
关于call与apply的理解容易让人凌乱,这里有个方法可供参考 tiger.call(fox,arg1,arg2...) tiger.apply(fox,[arg1,arg2...]) 理解为 fo ...
- javascript中的prototype和constructor
构造函数 我们知道,ECMAScript5中的Object.Array.Date.RegExp.Function等引用类型都是基于构造函数的,他们本身就是ECMAScript5原生的构造函数.比如,我 ...
- 第六章 prototype和constructor
首先我们看下面一段代码(第六章 01.htm) function myfun() //定义一个函数myfun { }; console.log(typeof (myfun.prototype)); c ...
- Javascript中的__proto__、prototype、constructor
今天重温了下Javacript,给大家带来一篇Javascript博文,相信对于Javacript有一定了解的人都听过prototype原型这个概念,今天我们深度的分析下prototype与__pro ...
- Prototype and Constructor in JavaScript
The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JA ...
- JavaScript中的 prototype 和 constructor
prototype属性 任何js函数都可以用作构造函数, 而构造函数需要用到prototype属性, 因此, 每个js函数F(除了ES5的Function.bind()方法返回的函数外) 都自动拥有 ...
随机推荐
- css字体的样式与分类用法总结
字体的样式 color 设置文本的颜色(前景色) ,它会应用到元素的所有边框,除非被 border-color 或另外某个边框颜色属性覆盖. <style> .box1 { color: ...
- SQL数据库—<5>视图、索引…简单学习
视图 掌握:1.视图是个什么东西?2.会建视图,会查视图3.知道视图的主要功能是查询,不是增删除改. 视图的定义: 视图可以认为是从一个数据表或者多个数据表中导出的表,视图本身没有任何数据,它是用来存 ...
- Linux学习笔记0-CentOS7关闭防火墙
关闭防火墙 systemctl stop firewalld.service //停止firewall systemctl disable firewalld.service //禁止firewall ...
- docker学习---搭建Docker私有库及删除库内镜像
环境准备系统: cat /etc/redhat-release CentOS Linux release (Core) 主机两台,分别是docker私有库服务器(IP 192.168.121.121) ...
- C++ 虚函数和多重继承的内存布局初探
C++ 对象的内存布局 一切以事实说话: 代码: 1: #include <stdio.h> 2: 3: class A { 4: public: 5: int a; 6: int b; ...
- U200-SNMP
U200配置snmp snmp-agent sys-info version v2c snmp-agent community read jkzh snmp-agent trap enable snm ...
- cocos2D-X c++ call java
{ //https://blog.csdn.net/yuechuzhao/article/details/9283847 }
- UNP学习第四章tcp
一.TCP简单流程图 因为对于server我已经写过一篇笔记了:http://www.cnblogs.com/ch122633/p/8315883.html 所以我想再补充一些对于client的部分的 ...
- kubernetes集群中移除Node
例如要在集群中移出node2节点1)在master节点上执行: kubectl drain node2 --delete-local-data --force --ignore-daemonsets ...
- spss乱码问题解决
spss乱码问题解决 方法1:网友kuangsir6提供 选择字体为:DFKai-SB 格式(我并没有找到这个格式) 方法是 SPSS(PASW)---Edit---Options---Viewer- ...