对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项目中使用时却比较麻烦,便直接粗略了解后开始 ...
随机推荐
- Exception in thread "main" java.lang.UnsupportedClassVersionError
Exception in thread “main" java.lang.UnsupportedClassVersionError这个报错是用高版本JDK编译项目或文件产生的class文件, ...
- 纠结了一下午的问题:运行opencv的HoughLinesP函数出错
问题描述:检测出的直线数量显然不对,非常巨大.程序运行崩溃. 解决办法:在添加附加依赖项时,Dubug模式只添加opencv_world310d.lib,Release模式下只添加opencv_wor ...
- Spring的回滚问题
再说下声明式事务和注解事务回滚的原理:当被切面切中或者是加了注解的方法中抛出了RuntimeException异常时,Spring会进行事务回滚.默认情况下是捕获到方法的RuntimeExceptio ...
- Delphi中Chrome Chromium、Cef3学习笔记(六)
原文 http://blog.csdn.net/xtfnpgy/article/details/71703317 一.CEF加载网页时空白 chrm1.Load(‘你的网址’); 出现空白,跟 ...
- 循环列表最后一条不显示borderBottom
You could achieve this using some logic: return books.map((book, i) => { return( <View style={ ...
- c#电子印章制作管理系统
产品名称:电子印章制作管理系统 版 本 号:v0.0.0.1产品说明:本产品采用位图绘制方式,主要针对OA.ERP.金融等行业取代实物印章的一款产品,本产品有以下特点1.制作方便,容易操作2.规格 ...
- 吴裕雄 python matplotlib 绘图示例
import matplotlib.pyplot as plt plt.scatter([1,2,3,4],[2,3,2,5])plt.title('My first plot')plt.show() ...
- 如何在Mac上用汇编语言写HelloWorld
首先,Mac自带nasm,不过我们要先将其升级. 升级它的方法有很多种,因为我已经装好了homebrew,所以我直接在终端输入: brew install nasm 这样就升级啦- 接下来,创建一个H ...
- Linux开始结束ping命令
ctrl+c可以终止ping ctrl+z可以暂停ping,该暂停只是把进程放到后台去了,使用命令fg可以调出到前台来 通过以下命令可以设置次数: ping -c 10 (次数) ip(域名) ...
- linux卸载erlang
rpm -qa | grep erlang | xargs rpm -e --nodeps