JavaScript原型与原型链
一、数据类型
JavaScript的数据类型可以分为基本数据类型和引用数据类型。
- 基本数据类型(6种)
- String
- Number
- Boolean
- null
- undefined
- Symbol(ES6)
- 引用数据类型
- Object
二、面向对象编程
- 构造函数
- 面向对象编程的第一步,就是要生成对象。前面说过,对象是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后对象根据这个模板生成。
- JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。
- 构造函数就是一个普通的函数,为了与普通函数区别,构造函数名字的第一个字母通常大写。
构造函数的特点有两个。
- 函数体内部使用了this关键字,代表了所要生成的对象实例。
- 使用new命令生成对象。
2. new命令
new命令的作用,就是执行构造函数,返回一个实例对象。
new 命令的原理
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的prototype属性。
- 将这个空对象赋值给函数内部的this关键字。
- 开始执行构造函数内部的代码。
如果构造函数内部有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
小结
自定义函数.__proto__指向Function.prototype
Object.__proto__指向Function.prototype
即Object.__proto__ === Function.prototype//true
Function.__proto__指向Function.prototype
:Function也是一个函数,函数是一种对象,也有__proto__
属性。既然是函数,那么它一定是被Function创建。所以Function是被自身创建的。所以它的__proto__
指向了自身的Prototype。Function.prototype.__proto__===Object.prototype//true
Object.prototype的
__proto__
指向的是null
总结
- 对象是函数创建的,而函数却又是一种对象。也是属性的集合
- 每个函数都有一个属性叫做prototype。
- 对象的原型,指向构造函数的prototype属性。
- prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。
- 原型既然作为对象,属性的集合,可以自定义的增加许多属性。
总之记住下面这几个要点
- Object对象是由Function函数创建的
- 所有函数都是由Function创建的,函数也是对象
- 重要的公式
var 对象名 = new 函数名()
对象名.__proto__=== 函数名.prototype
- 普通函数的prototype属性值是一个对象
- Function.prototype有
__proto__
这个属性 Object.prototype.__proto__===null
结果为true
JavaScript原型与原型链的更多相关文章
- JavaScript继承与原型链
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...
- 【javascript基础】4、原型与原型链
前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...
- 【JavaScript】深入理解JavaScript之强大的原型和原型链
由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...
- Javascript 原型和原型链
先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...
- javascript 原型 和 原型链
最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...
- JavaScript深入之从原型到原型链(本文转载)
JavaScript深入之从原型到原型链(本文转载) https://github.com/mqyqingfeng/Blog.原文地址 构造函数创建对象 我们先使用构造函数创建一个对象: functi ...
- javascript 之原型、原型链-14
原型 原型是一个对象,每个函数对象(在javascript 之对象中说过函数也是对象 )都有一个属性(prototype)指向这个对象--原型对象,这个对象的作用是让所有对象实例共享原型对象中的属性. ...
- JavaScript prototype原型和原型链详解
用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
随机推荐
- c#获取网络时间并同步本地时间
通过TCP形式来获取NTP时间.主要代码如下: [DllImport("kernel32.dll")] private static extern bool SetLocalTim ...
- 04、NetCore2.0下Web应用之Startup源码解析
04.NetCore2.0Web应用之Startup源码解析 通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...
- jQuery系列 第五章 jQuery框架动画特效
第五章 jQuery框架动画特效 5.1 jQuery动画特效说明 jQuery框架中为我们封装了众多的动画和特效方法,只需要调用对应的动画方法传递合适的参数,就能够方便的实现一些炫酷的效果,而且jQ ...
- angualar2——八大组成
Angular2 模块 理解: Angular 应用是模块化的,并且 Angular 有自己的模块系统,它被称为 Angular 模块或 NgModules. 组件 组件是一个项目主干,一个模块由多个 ...
- python学习笔记1--python简介和第一行代码编写
一.什么是python? python是一种面向对象,解释型语言,它语法简介,容易学习.本节博客就来说说本人学习python的心得体会. 二.python环境安装 目前python版本有python2 ...
- 个人建站&mac下安装hexo
title: 个人建站&mac下安装hexo date: 2018-04-18 16:34:02 tags: [mac,blog,个人建站,markdown] --- 这两天使用了markdo ...
- Redis事务管理
用过其他关系型数据库(比如msql)的肯定都指定,在关系型数据库里面的事务可以保证多个命令操作要么同时成功,要么同时失败.并且在执行事务的时候,可以有隔离级别. 但是在Redis中的事务,只是保证事务 ...
- Centos常用命令之:搜索
在linux中,所有的文件都是以目录树的形式存在的.而每个发行版的文件存放之间又会有些差别. 这时候,如果我们想看某个命令或者文档的时候就必须先通过某种方式找到改文档的所在位置. 在linux中提供了 ...
- [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 51nod 1682 中位数计数
1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均 ...