一、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原型及构造函数的相关理解的更多相关文章

  1. js原型和构造函数

    前言 从应用层面深入理解原型模式和js中的构造函数. 构造函数(constructor) js中的任何对象都有自己的构造函数.js中使用字面量声明的普通对象({})或数组([])等子对象本质上都是使用 ...

  2. js原型和构造函数混合模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends

    说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...

  4. Js中关于构造函数,原型,原型链深入理解

    在 ES6之前,在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但 ...

  5. JS原型、原型链、构造函数、实例与继承

    https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...

  6. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  7. JS原型的剖析与理解

    原型相关的概念 关于面向对象的概念 类 class 在js中就是构造函数 在传统的面向对象语言中,使用一个叫类的东西定义模版,然后使用模版创建对象 在构造方法中也具有类似的功能,因此称其为类 实例与对 ...

  8. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  9. 个人对JS原型链的一些理解(prototype、__proto__)

    前言 在我一开始学习java web的时候,对JS就一直抱着一种只是简单用用的心态,于是并没有一步一步地去学习,当时认为用法与java类似,但是在实际web项目中使用时却比较麻烦,便直接粗略了解后开始 ...

随机推荐

  1. Spring Boot——Linux 启动方式

    1.前台启动:(ctrl+c会关闭程序) java -jar    ****.jar 2.后台启动:(& 后台启动) java -jar    ****.jar & 3.控制台输出启动 ...

  2. Django_tips

    一.Django的配置静态文件(settings) STATIC_URL = '/static/' #引用名 STATICFILES_DIRS = ( os.path.join(BASE_DIR,&q ...

  3. 1. vs code 设置快捷键与eclipse一样

    keybindings.json文件路径在:C:\Users\Administrator\AppData\Roaming\Code\User\keybindings.json { "key& ...

  4. django APPEND_SLASH

    #设置项是否开启URL访问地址后面不为/跳转至带有/的路径APPEND_SLASH=True

  5. AS3获得当前文件的文件名

    //当前文件的完整路径var fileUrl:String = this.loaderInfo.url;//查找路径的最后一个"/"var flag:int = fileUrl.l ...

  6. laravel5.6框架中session的使用

    从session中获取数据 $value = $request->session()->get('key', 'default'); 冲session中获取所有数据 $data = $re ...

  7. Java爬虫——常用的maven依赖

    java实现爬虫常用的第三方包: httpclient,for http jsoup,for dom rhino,for js jackson,for json pom.xml摘录 <depen ...

  8. __proto__、prototype和原型对象

    一.__proto__ 对象内部存在一个指针,用来指向上一层函数的原型对象.ECMA-262第五版中关这个指针叫[[prototype]],但Firefox.Safari和Chrome在每个对象上都支 ...

  9. Python3 获取本机 IP

    通过 UDP 获取本机 IP,没有任何的依赖,也没有去猜测机器上的网络设备信息,而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的 ...

  10. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析

    (一)需求规格说明书github地址:https://github.com/gzyt/SRS (二)原型链接:http://www.cnblogs.com/lztxh/p/9011873.html ( ...