之前有说过继承,在js中没有类,所以在new的后面,放的是构造函数,在构造函数中有一个属性prototype,js的继承全靠它。

在js中对象的类型有很多,常见的就是普通对象,和函数对象,在对象中都会有一个属性叫_proto_,这个属性对应着相应的对象原型。

这里补充一下对象还有一个属性是,constructor.这个属性对应创建所有指向该原型的实例的构造函数。(换个说法,他是一个指针,指向构造函数);

prototype这个属性,在构造函数创建被new出来的时候,prototype将作为原型值,赋值给其他所有对象的实例。所以解决了构造函数不能实例共享的麻烦。(这里我在我的js继承里有说过,不懂得可以去看一下。)

总结一下就是。每个对象都有一个属性就是 _proto_  。函数对象不仅有_proto_属性,还有prototype属性,函数的prototype作为属性值作为原型值,赋值给所有的实例对象;

也就是赋值_proto_.

简单的个案例解释一下:

function  d(name){

  this.name = name;

}

var  a  = new  d('haha');

这里new 的一个过程,

1、var a= {};初始化一个对象a;

2、a._proto_ =  d.prototype;   将对象p的 __proto__ 属性设置为 d.prototype;

3、d.call(p,”张三”,20);调用构造函数d来初始化p。关于call/apply使用

这里说简单说一下call和apply的使用,他是用来重定向this指向的。(详细理解可以去看这个:  https://www.cnblogs.com/Shd-Study/p/6560808.html     )

这里还有一点,就是我们打印a._proto_ =  d.prototype;  打印结果都是为true;

在这里我们想要更好的理解_proto_和constructor.这俩个属性,我们可以打印出来看一下

在图中我们可以看到对象的俩个属性。

这个告诉我们constructor这个就是指向的构造函数

这个里面的等式,是不是有着什么样的关系。前面我们也说过,构造函数的过程里面有着这样的一部就是,把d.prototype赋值给这边f1._proto_;

今天我们就先说这么多,下次接着说!

分割线-------------------------------------------------------------------------------------------

接着上次说

比如当我们访问

a.show()这个方法的时候。我们可以发现,其实a是没有这个方法的。那么a就是向他的实例上去找。就是d。而这时候我们可以看到其实d也没有show这个方法。

那怎么办,这时候会向d的上一级去找就是object.prototype。有人要问这个是什么啊。这个是总的对象原型。什么意思呢。就是所有的对象的原型。所有对象最后都指向这个。

但是我们都找到最后都找不到这个方法了,那没办法了,只能告诉他是null了。这一个过程就是原型链

可以得到一个等式

a._proto_._proto_ ._proto_ == null       //true

还有上次我们说过constructor他是指向我们的构造函数,也就是实例d

我们可以思考一下constructor这个方法是哪来的。为啥会有这个方法

其实这也就是继承,继承object.prototype而来的

js原型、原型链的更多相关文章

  1. 前端基本知识(二):JS的原型链的理解

    之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...

  2. js javascript 原型链详解

    看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...

  3. 攻略前端面试官(三):JS的原型和原型链

    本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...

  4. js中的原型,原型链和继承

    在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript最 ...

  5. 怎么理解js的原型链继承?

    前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...

  6. 详聊js中的原型/原型链

    先以一段简单的代码为例: function Dog(params){     this.name = param.name;     this.age = param.age;     this.ba ...

  7. 一文让你对js的原型与原型链不再害怕、迷惑

    目录 原型与原型链的详细剖析 原型 显式原型prototype 隐式原型__proto__ 显式原型prototype与隐式原型__proto__的关系 原型链(隐式原型链) 探寻原型链的尽头 完整详 ...

  8. 基础1:JS的原型和原型链究竟

    JS的原型和原型链究竟是什么? 1. 从JS创建一个对象开始说起: 1.1 工厂模式创建对象 (缺点是无法知道创建出来的对象是一个什么类型的对象) function createPerson(name ...

  9. js中的原型对象链

    由于原型对象也是一个对象,它也有自己的原型对象并继承对象中的属性,这就是原型对象链:对象继承其原型对象,而原型对象继承它的原型对象,以此类推. 我们创建的每一个函数都有一个prototype(原型)属 ...

  10. js的原型

    在讲js的原型之前,必须先了解下Object和Function. Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是 ...

随机推荐

  1. Java并发编程:Callable、Future和FutureTask 实现龟兔赛跑

    1.不清楚的看博客http://www.cnblogs.com/dolphin0520/p/3949310.html 我们使用上面的代码来实现一个龟兔赛跑 package com.weiyuan.te ...

  2. RabbitMQ:五、高阶

    存储机制 持久化的消息和非持久化的消息都可以被写入到磁盘. 持久化的消息一开始就会写入磁盘,如果可以,也会在内存中保存一部分以提高性能,当内存吃紧时会从内存中清楚. 非持久化的消息一般存储在内存中,内 ...

  3. 怎么更改maven工程jdk版本(默为1.5,怎么更改jdk版本为1.8)

    使用maven 创建工程更改默认jdk版本(1.5)方法 step1: 找到自己项目的pom.xml文件,添加下图黄色区域代码(文末附上的有代码:可以直接复制) step2: 保存一下更改后的的pom ...

  4. TCP协议粘包问题详解

    TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...

  5. 错误C2280 Union:尝试引用已删除的函数

    在编写Union共用体类型的时候,写了如下代码,在第5行出现错误: #include <iostream> #include <string> using namespace ...

  6. Nginx 反向代理可以缓存 HTTP POST 请求页面吗?

    摘要: Nginx 反向代理可以缓存 HTTP POST 请求页面吗?  2017-09-05 景峯 Netkiller 本文节选自<Netkiller Web 手札> 作者:netkil ...

  7. 如何在Vim中更改颜色和主题

    大家好,我是良许. Vim是我们在Linux中非常常用的一款文本编辑器.Vim 是一款免费.开源的文本编辑器,它的功能和许多其他的文本编辑器大致相同,比如 Sublime 和 Notepad++ .V ...

  8. SpringBoot 2.x添加Druid作为数据库连接池

    整合了一大堆ORM,是时候增加一个连接池了,此处选用了druid作为连接池,druid是alibaba开源平台上的一个数据库连接池实现,对比c3p0,dbcp加入了对数据库的监控,不知道甩出几条街的距 ...

  9. Netty 中的内存分配浅析-数据容器

    本篇接续前一篇继续讲 Netty 中的内存分配.上一篇 先简单做一下回顾: Netty 为了更高效的管理内存,自己实现了一套内存管理的逻辑,借鉴 jemalloc 的思想实现了一套池化内存管理的思路: ...

  10. A*算法求K短路模板 POJ 2449

    #include<cstdio> #include<queue> #include<cstring> using namespace std; const int ...