原型及原型链,以及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 ...
随机推荐
- 用js写一个回车键盘事件
用js来监听键盘事件,代码如下: <script type="text/javascript" language=JavaScript charset="UTF-8 ...
- EL函数和自定义EL函数
简介 EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了.但是EL函数还是和JSTL技术绑定在一起.下面将介绍如何 ...
- Scikit-Learn与决策树
Scikit-Learn(决策树)可以用于方法分类和回归. 一.分类 sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='b ...
- golang windows 安装方法
编译器下载链接:https://golang.org/dl/ 默认安装到C盘,不用修改. 添加环境变量: 配置环境变量: 注:C:\mygo\bin 配置这个后,则可以直接在 Dos ...
- margin属性的正负值确定
margin属性用来使用设置外边距,大多数情况使用正值,但是一些稍复杂的定位就会使用到负值,所以对margin属性的正负值理解是有必要的,本文同时解释了margin-right和margin-bott ...
- JavaScript数组方法大全
1.两个数组拼接的方法: Array.concat(obj); var array = [1,2,3]; var array2 = [4,5,6]; var arrtotall = array.con ...
- Python应用场景
Web应用开发 Python经常被用于Web开发.比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序.Python定义了WSGI标准应用接口来协调Http服务器与基于P ...
- HPU--1280 Divisible
题目描述 给定一个很大的整数,我想知道它能否被9整除. 输入 有t组测试数据,每组数据给定一个整数N不存在前导0.(1 <= t <= 20,1 <= N <= 10^200) ...
- NYOJ_23_取石子(一)
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...
- java异常捕获的一点感悟
class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static v ...