原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)
首先,js的数据结构有 原始类型(5种):Boolean、Number、String、Null、Underfined,
然后是引用类型:Array、Date、Error、RegExp、Function、Object,注意这里,引用类型的返回值,其实只有2种,也就是Function和Object,用typeof就可以判断出。
js一切都是对象,Function自然也是对象,甚至Function比Object的功能更强大,new Function出来的变量,比如:
function Foo(){}
var foo = new Foo();
typeof Foo //function
typeof foo //object
Function和Object的区别,重点来了,Function有prototype属性,而Object是没有的:
console.log(Foo.prototype) //Object
console.log(foo.prototype) //undefined
下面来说原型链和继承:
js是通过__proto__来明确继承 的关系,__proto__不同于prototype,因为__proto__是对象的属性,因此Function和Object都有这个属性,在强调一下,Object是没有prototype的,而Function和Object都有__proto__属性。
然后看一下__proto__这个属性是怎么工作的,例如:
var a = {aa:1};
var b = {bb:2};
var c = {cc:3};
a.__proto__ = b;
b.__proto__ = c;
console.log(a.aa);//
console.log(a.bb);//
console.log(a.cc);//
这就简单的实现了继承,也就是原型以及原型链。既然__proto__解决了继承的问题,那么prototype干什么呢?当然有它自己的用处,再回到上一个例子:
function Foo(){}
var foo = new Foo();
console.log(Foo.prototype===foo.__proto__)//true
精髓就在于此:通过new构造函数构造出来的实例对象foo,它的__proto__属性,其实是一个指针,它指向的是构造函数Foo的prototype属性。
为了便于以后复习,我总结一下上面内容,可能有理解不对的地方,希望大神指正。
1、object.__proto__指向他的原型对象,如果他的原型对象的__proto__还有上面的原型对象,比如:
var a = {aa:1};
var b = {bb:2};
var c = {cc:3};
a.__proto__ = b;
b.__proto__ = c;
那么,a就继承了c的属性和方法,这就是原型和原型链,继承就是这样实现的。
2、关于prototype和__ptoto__:
首先,Function和Object都属于引用类型(平级的),都是对象,因此,都具有__proto__属性。
其次,Function有prototype属性而Object没有。
prototype和__ptoto__两者的关系是,实例对象的__proto__指向的就是构造函数的prototype:
function Foo(){}
var foo = new Foo();
console.log(Foo.prototype===foo.__proto__)//true
原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)的更多相关文章
- 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结
1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象 ...
- javascript原型与原型链,prototype、__proto__、constructor
javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...
- 彻底理解什么是原型链,prototype和__proto__的区别以及es5中的继承
再讲一遍好了( 参考https://blog.csdn.net/cc18868876837/article/details/81211729 https://blog.csdn.net/lc23742 ...
- Javascript中的原型链、prototype、__proto__的关系
javascript 2016-10-06 1120 9 上图是本宝宝用Illustrator制作的可视化信息图,希望能帮你理清Javascript对象与__proto__.prototype和 ...
- JavaScript原型和原型链( prototype 与 __proto__ )
一.函数对象 所有引用类型(函数.数组.对象)都拥有__proto__属性(隐式原型) 所有函数拥有 prototype 属性(显式原型)(仅限函数) 原型对象:拥有 prototype 属性的对象, ...
- Javascript之傻傻理不清的原型链、prototype、__proto__
新人学习Javascript,其中的原型链一直是云里雾里,不得要领,查了很多相关资料,觉得这遍讲得最为清晰易懂,特转载分享,共同学习. 1. JavaScript内置对象 所谓的内置对象 指的是:Ja ...
- 理解js中的原型链,prototype与__proto__的关系
说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...
- 【转】理解js中的原型链,prototype与__proto__的关系
说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...
- [转]理解js中的原型链,prototype与__proto__的关系
本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...
随机推荐
- 每天来点Java面试题(一)
(1)java 中的 static 字段的 使用: 什么是 static ? 它是 java 的修饰符,定义静态变量和静态方法. 什么时候用? 通常用在工具类里面,修饰静态方法,然后供其它类的方法使 ...
- cocos 射线检测 3D物体 (Sprite3D点击)
看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...
- Qt中使用CEF(Windows下)
最近项目中要在Qt中使用CEF(Chromium Embedded Framework),在这里总结下其中的几个要点. 下载合适的CEF版本 关于CEF的简介我们这里就不做介绍了,下载CEF可以有2种 ...
- 认识cpu、核与线程
作为一个后台开发人员,我想有必要了解这些基础知识.如果本文有不严谨或者疏忽的地方,请指正. cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核 ...
- maven创建web工程Spring配置文件找不到问题解决方案
使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...
- linux服务器部署jar包以及shell脚本的书写
背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...
- [javascript] postmessage
摘要 postmessage 作为 html5 跨域传值的解决方法,灰常好用啊..本次用的是页面a 用iframe 嵌入 页面b. 使用方法 postmessage 参数 otherWindow.po ...
- 智慧航空AI大赛-阿里云算法大赛总结 第一赛季总结
[以前的文章]最后一公里极速配送 - 阿里云算法大赛总结 总结一下新的教训 1.由于都是NP难题,获得最优解用常规的方法非常困难,对于不是算法科班出身的人来说,首先应该到网络上寻找一下论文,是否有一些 ...
- java NIO详解
http://zalezone.cn/2014/09/17/NIO%E7%B2%BE%E7%B2%B9/ 1. 前言 我们在写java程序的时候,为了进行优化,把全部的精力用在了处理效率上,但是对IO ...
- css鼠标样式cursor
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...