对js原型及构造函数的相关理解
一、js中的原型
创建(声明)一个函数,浏览器在内存中会创建一个对象。
每个函数都默认会有一个属性prototype指向了这个对象,就是说prototype的属性的值就是这个对象。
此对象就是该函数的原型对象,简称函数的原型。
这个原型也默认有一个属性constructor指向了这个函数,就是说constructor属性的值是该函数。
原型对象主要作用是继承
二、构造函数
当用new创建对象时,这个对象会存在一个默认不可见的属性去指向构造函数的原型对象;
这个属性用prototype表示,并且没办法直接访问到。
function Person () {} // 构造函数
Person.prototype.name = "zhangsan"; // 添加属性
Person.prototype.callName = function () { // 添加方法
console.log(this.name);
}
var p1 = new Person(); // p1虽然使用Person的构造函数,但是已经和他没关系了
console.log(p1.name); --> zhangsan // 能取到值
p1.callName() --> zhangsan
p1.name = "lisi"; // 可以修改,但是不能修改到prototype,也再也取不到之前的值了
console.log(p1.name); --> lisi
p1.callName() --> lisi
console.log(Person.name); --> zhangsan
Person.callName() --> zhangsan
var p2 = new Person(); // p1 p2 两个没关系,互不干扰;他们都是Person的实例,都有constructor属性,指向的都是Person
三、相关的属性
1)prototype
存在于构造函数(其他函数中也存在,只是不关注)指向构造函数的原型对象。
2)constructor
存在原型对象中,指向的是这个构造函数。
Person.prototype.constructor === Person --> true
如果给给原型增加对象字面量,
Person.prototype = {
name: "zhangsan",
age: 20
}
那么constructor将不再指向该构造函数。
Person.prototype.constructor === Person --> false
如果你非要constructor指向你的构造函数呢,那么应该在原型中增加constructor的指向,如
Person.prototype = {
constructor : Person //让constructor重新指向Person函数
}
3)_proto_
之前说到prototype是不可访问的,但是在个别浏览器(Chrome和Firefox,IE不支持)中是提供访问方式的;
但是尽量不要用,因为会改变这个对象的继承原型链。
4)hasOwnProperty()
判断属性是否是自己添加的返回true,如果是原型中或者没有这个属性那么返回false
5)in
判断属性是否存在这个对象中,先在该对象中找,再去原型找,找不到才返回false
对js原型及构造函数的相关理解的更多相关文章
- js原型和构造函数
前言 从应用层面深入理解原型模式和js中的构造函数. 构造函数(constructor) js中的任何对象都有自己的构造函数.js中使用字面量声明的普通对象({})或数组([])等子对象本质上都是使用 ...
- js原型和构造函数混合模式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends
说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...
- Js中关于构造函数,原型,原型链深入理解
在 ES6之前,在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但 ...
- JS原型、原型链、构造函数、实例与继承
https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- JS原型的剖析与理解
原型相关的概念 关于面向对象的概念 类 class 在js中就是构造函数 在传统的面向对象语言中,使用一个叫类的东西定义模版,然后使用模版创建对象 在构造方法中也具有类似的功能,因此称其为类 实例与对 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- 个人对JS原型链的一些理解(prototype、__proto__)
前言 在我一开始学习java web的时候,对JS就一直抱着一种只是简单用用的心态,于是并没有一步一步地去学习,当时认为用法与java类似,但是在实际web项目中使用时却比较麻烦,便直接粗略了解后开始 ...
随机推荐
- 7.3.5 Tomcat堆溢出分析(1)
实战Java虚拟机:JVM故障诊断与性能优化>第7章分析Java堆,本章主要介绍了Java堆的分析方法.首先,介绍了几种常见的Java内存溢出现象及解决思路.其次,探讨了java.lang.St ...
- strace参数
strace参数 -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filen ...
- BATCH、事务、CLOB、BLOB
Batch:需要执行大量的数据时可以使用批处理 注意点: 1.尽量使用Statement,因为如果是PreParedStatement可能会因为数据量太大而存在空间问题,编译器会报错. 2.把自动提交 ...
- GC roots
1.虚拟机栈(本地变量表)引用的对象 2.方法区静态属性引用的对象 3.方法区常量引用的对象 4.本地方法栈JNI(一般指naive方法)中引用的对象 常说的GC(Garbage Collecto ...
- 一些最常见的SNMP的OID自动翻译成zabbix数字进行表示(华为9306)
转载自:https://blog.51cto.com/davidbj/1173954 随着Zabbix 2.0版本的发布,很多企业开始用zabbix来代替之前的Nagio.Cacti等其它监控软件.至 ...
- JHipster简介
JHipster简介 JHipster或者称Java Hipster,是一个应用代码产生器,能够创建Spring Boot + AngularJS的应用.开源项目地址:JHipster/Github. ...
- Zabbix常见问题
1.Q: agent日志中出现“active check configuration update from [127.0.0.1:10051] started to fail (cannot co ...
- cdh启动datanode报错
问题: 为cdh新增节点时,在分配datanode后,启动报错 Can't open /iot/opt/cloudera-manager/cm-5.11.2/run/cloudera-scm-agen ...
- 8Linux磁盘划分、RAID
磁盘划分fdisk 1.磁盘分区 fdisk 2.格式化 mkfs.ext4 mkfs.xfs 3.挂载 mount 路径 挂载路径 fdisk命令中的参数以及作用 参数 作用m 查看全部可用的参数n ...
- pyqt-QGrapicsView类
QGrapicsView类 QGraphicsView提供一个显示QGraphicsScene内容的窗口,该窗口可以滚动,可以在构造时候把场景对象作为参数,或者之后使用setScene()来设置vie ...