JavaScript之函数原型链完整版
我的上一篇文章有解释绅士原型及简单的原型链,在这里我将对原型链做完整讲述;
// 函数的原型链: 把函数当对象(实例对象)来看
function Person(){}
// 底层Function创建出来的Person, 底层中任意函数都是Function创建的
// var Person = new Function();
// 把Person 当孩子来看,Person对象的原型链长啥样
// Person ==> Function.prototype ==> Object.prototype ==> null;
// console.log( Person.__proto__ == Function.prototype );
// console.log( Function.prototype.__proto__ );
// Person.prototype 这个prototype属性是函数Person自带的
// Function.prototype 是唯一的原型对象的类型是个函数的
// Function.prototype 原型对象有call apply bind三个方法
console.dir( Function.prototype );
// 函数都可以去使用call apply bind方法, 是的
// 1. 把Person函数当函数用,具体当构造函数用
function Person(){}
var p = new Person();
// 绘制以上代码的原型三角关系
// 构造函数: Person
// 原型对象: Person.prototype
// 实例对象: p
// console.log( Person.prototype.__proto__ === Object.prototype ); // 2. 把Person函数当对象看,当实例对象看(孩子)
// Person这个孩子谁创建的?
// 底层 var Person = new Function();
// 绘制以上代码的原型三角关系
// 构造函数: Function
// 原型对象: Function.prototype
// 实例对象: Person // 3. 把Object考虑进来,把Object当构造函数来看
var obj = new Object();
// 绘制以上代码的原型三角关系
// 构造函数: Object
// 原型对象: Object.prototype
// 实例对象: obj
// 4. 把Object当实例对象来看,孩子看,Object孩子谁生的
// 底层 var Object = new Function();
// 绘制以上代码的原型三角关系
// 构造函数: Function
// 原型对象: Function.prototype
// 实例对象: Object
// console.log( Object.__proto__ === Function.prototype ); // 5. Function 函数是谁生下来的,是Function自己
// var Function = new Function();
// 绘制以上代码的原型三角关系
// 构造函数: Function
// 原型对象: Function.prototype
// 实例对象: Function
console.log( Function.__proto__ == Function.prototype );
案例:
console.log( Function.prototype === Function.prototype ); // true
console.log(Object.__proto__ === Function.prototype); // true
console.log( Function.prototype.__proto__ === Object.prototype ); // true
console.log( Object.prototype.__proto__ === Object.prototype ); // false
console.log( Object.__proto__.__proto__ === Object.prototype ); // true
// 面试题
// Function的prototype原型对象有没有在Function对象的原型链上
/*console.log(Function instanceof Function); // true
console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true
console.log(Object instanceof Object); // true*/ // 练习
function Person() {}
var p = new Person()
console.log(p.constructor); // Person
console.log(Person.constructor); // Function
JavaScript之函数原型链完整版的更多相关文章
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
- JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)
1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...
- JAVASCRIPT闭包以及原型链
方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...
- javaScript里的原型链
原型对象也是普通的对象,是对象一个自带隐式的__proto__属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链.原型链是由一些用来继承和共享属性的对象组成的( ...
- JavaScript继承与原型链
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...
- 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结
1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象 ...
- JavaScript中的原型链和继承
理解原型链 在 JavaScript 的世界中,函数是一等公民. 上面这句话在很多地方都看到过.用我自己的话来理解就是:函数既当爹又当妈."当爹"是因为我们用函数去处理各种&quo ...
- JavaScript -- 继承与原型链
JavaScript对象有一个指向一个原型对象的链,当试图访问一个对象的属性的时候,他不仅仅会在该对象上面搜寻,还会搜寻该对象的原型,以及对象的原型的原型,依次层层搜索,直到找到名字匹配的属性或者到达 ...
随机推荐
- mongodb 副本集之入门篇
作者: 凹凸曼-军军 前言:mongodb 因为高性能.高可用性.支持分片等特性,作为非关系型数据库被大家广泛使用.其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群) ...
- 使用Python开发鸿蒙设备程序(0-初体验)
到目前为止,鸿蒙设备开发的"官方指定语言"还是C语言! 这看起来是一件正常的事,毕竟鸿蒙设备开发还是属于嵌入式开发的范畴,而在嵌入式开发中C语言又是当之无愧的首选,所以,大家也都接 ...
- 2. git命令行操作之本地库操作
2.1 本地库初始化 git init 命令 用于创建一个空的Git本地仓库或重新初始化一个现有本地仓库 注:.git目录中存放的是本地库相关的子目录和文件,不要删除也不要随意修改 git confi ...
- Kafka入门之broker-消息设计
消息设计 1.消息格式 Kafka的实现方式本质上是使用java NIO的ByteBuffer来保存消息,同时依赖文件系统提供的页缓存机制,而非依靠java的堆缓存. 2.版本变迁 0.11.0.0版 ...
- CentOS基础命令使用技巧-1
less用法 g快速返回文件首部 G快速到文本最末端 /当前行向下搜索 ?当前行向上搜索 n显示下一个 q退出 cp用法 r拷贝一个目录必须加这个 rm用法 r删除目录 f强制删除,r后面删除不存在的 ...
- Java MQTT 客户端之 Paho
Paho 自动重连后订阅的主题会清空,所以需要实现 MqttCallbackExtended 接口,在 connectComplete 方法添加订阅主题:而不是实现 MqttCallback 接口 一 ...
- C#Excel导出注意事项
Excel 导出 1.首先在服务器中安装office ,并且要注册2.在组件服务中 设置Microsoft.excel.appliction 属性中设置自定义加network service用户并交互 ...
- PyQt学习随笔:Model/View架构中的Delegate(委托)
不同于MVC模式,Model/View设计并不包含用于处理与用户交互的完全独立的部件, 没有将用户交互部分完全分离.一般地,视图负责把模型数据显示给用户,以及处理用户的输入.但是,对于某些特殊要求(比 ...
- PyQt(Python+Qt)学习随笔:QAbstractScrollArea的sizeAdjustPolicy、horizontalScrollBarPolicy、verticalScrollB属性
老猿Python博文目录 老猿Python博客地址 Qt Designer中QAbstractScrollArea包括三个属性,分别是horizontalScrollBarPolicy.vertica ...
- 深入浅出让你理解什么是LLVM
什么是LLVM 转载自https://www.jianshu.com/p/1367dad95445 LLVM项目是模块化.可重用的编译器以及工具链技术的集合. 美国计算机协会 (ACM) 将其2012 ...