一、数据类型

JavaScript的数据类型可以分为基本数据类型和引用数据类型。

  1. 基本数据类型(6种)

    • String
    • Number
    • Boolean
    • null
    • undefined
    • Symbol(ES6)
  2. 引用数据类型
    • Object

二、面向对象编程


  1. 构造函数

    • 面向对象编程的第一步,就是要生成对象。前面说过,对象是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后对象根据这个模板生成。
    • JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。
    • 构造函数就是一个普通的函数,为了与普通函数区别,构造函数名字的第一个字母通常大写。

    构造函数的特点有两个。

    • 函数体内部使用了this关键字,代表了所要生成的对象实例。
    • 使用new命令生成对象。

2. new命令

new命令的作用,就是执行构造函数,返回一个实例对象。

new 命令的原理

  1. 创建一个空对象,作为将要返回的对象实例。
  2. 将这个空对象的原型,指向构造函数的prototype属性。
  3. 将这个空对象赋值给函数内部的this关键字。
  4. 开始执行构造函数内部的代码。

如果构造函数内部有return语句,而且return后面跟着一个对象,new命令会返回return语句指定的对象;否则,返回this对象。

var Fn=function(){
this.name='xxx';
this.old=18;
}
var f1=new Fn();
console.log(f1.name);//xxx
console.log(f1.old);//18

上面代码通过new命令,让构造函数Fn生成一个实例对象,保存在变量f1中。这个新生成的实例对象,从构造函数Fn得到了name和old属性。new命令执行时,构造函数内部的this,就代表了新生成的实例对象,this.name和this.old是实例对象的属性。

var Fn2=function(){
name='xxx';
old=18;
}
var f2=new Fn2();
console.log(f2.name);//undefined
console.log(f2.old);//undefined
f2.name='yyy';
console.log(f2.name);//yyy

三、原型与原型链

对象是函数创建的,而函数却又是一种对象。也是属性的集合,可以对函数进行自定义属性。

每个函数都有一个属性叫做prototype。

这个prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。

var Fn=function(){
this.name='xxx';
this.old=18;
}

回到上面new命令的原理的第二条,从这张图可以看到对象的原型,指向构造函数的prototype属性。

f1.__proto__指向构造函数的prototype属性,就是对象的原型。所以f1.__proto__===Fn.prototype为true

prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。

左边为Fn函数,右边就是它的原型

在上面可以看到f1.__proto__===Fn.prototype的结果为true

__proto__就是指向构造函数的prototype属性,Fn.prototype就是对象的原型

即,每个由构造函数创建的对象都有一个__proto__属性,指向创建该对象的函数的prototype。

基于以上,我们得到一个重要的公式

var 对象名 = new 函数名()

对象名.__proto__=== 函数名.prototype

小结

  1. 自定义函数.__proto__指向Function.prototype

  2. Object.__proto__指向Function.prototypeObject.__proto__ === Function.prototype//true

  3. Function.__proto__指向Function.prototype:Function也是一个函数,函数是一种对象,也有__proto__属性。既然是函数,那么它一定是被Function创建。所以Function是被自身创建的。所以它的__proto__指向了自身的Prototype。

  4. Function.prototype.__proto__===Object.prototype//true

  5. Object.prototype的__proto__指向的是null

总结

  1. 对象是函数创建的,而函数却又是一种对象。也是属性的集合
  2. 每个函数都有一个属性叫做prototype。
  3. 对象的原型,指向构造函数的prototype属性。
  4. prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。
  5. 原型既然作为对象,属性的集合,可以自定义的增加许多属性。

总之记住下面这几个要点

  1. Object对象是由Function函数创建的
  2. 所有函数都是由Function创建的,函数也是对象
  3. 重要的公式
    • var 对象名 = new 函数名()
    • 对象名.__proto__=== 函数名.prototype
  4. 普通函数的prototype属性值是一个对象
  5. Function.prototype有__proto__这个属性
  6. Object.prototype.__proto__===null结果为true

JavaScript原型与原型链的更多相关文章

  1. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  2. 【javascript基础】4、原型与原型链

    前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...

  3. 【JavaScript】深入理解JavaScript之强大的原型和原型链

    由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...

  4. Javascript 原型和原型链

    先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...

  5. javascript 原型 和 原型链

    最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...

  6. JavaScript深入之从原型到原型链(本文转载)

    JavaScript深入之从原型到原型链(本文转载) https://github.com/mqyqingfeng/Blog.原文地址 构造函数创建对象 我们先使用构造函数创建一个对象: functi ...

  7. javascript 之原型、原型链-14

    原型 原型是一个对象,每个函数对象(在javascript 之对象中说过函数也是对象 )都有一个属性(prototype)指向这个对象--原型对象,这个对象的作用是让所有对象实例共享原型对象中的属性. ...

  8. JavaScript prototype原型和原型链详解

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  9. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

随机推荐

  1. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...

  2. ZOJ-1655 Transport Goods---dijkstra变形&&最长路

    题目链接: https://vjudge.net/problem/ZOJ-1655 题目大意: 有N-1个城市给首都(第N个城市)支援物资,有M条路,走每条路要耗费一定百分比的物资.问给定N-1个城市 ...

  3. 06、NetCore2.0依赖注入(DI)之整合Autofac

    06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...

  4. 深入解析 SQL Server 高可用镜像实现原理

    作者:郭忆 本文由 网易云 发布. SQL Server 是 windows 平台 .NET 架构下标配数据库解决方案,与 Oracle.MySQL 共同构成了 DB-Engines Ranking ...

  5. Java多线程之生产者消费者

    生产者和消费者的实例: 商品类:/** * 商品类 * */public class Goods {    final int MAX_NUMBER = 30; // 最大数量    final in ...

  6. ASP.NET MVC 中 View 的设计

    1. 前言  感觉有好长时间没有接触View 了,周末闲来无事,翻翻书桌上的书来回顾回顾ASP.NET MVC中View的相关内容. 2. View概述  View 通过应用程序在Action 中返回 ...

  7. [NOI2009]变换序列

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50: 60%的数据中N ...

  8. 【BZOJ3224】【tyvj1728】普通平衡树

    最近开始学习平衡树,在学长的强烈推荐下学习了AVL.红黑树.splay(以上我都还没学)treap. 首先讲一下个人对treap(树堆)的理解. treap,顾名思义,就是tree+heap,首先因为 ...

  9. PKUWC 2018 滚粗记

    day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...

  10. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...