JS原型链中的prototype与_proto_的个人理解与详细总结
一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我)__被在此绕晕,图片就放在末尾了。)
以下三点需要谨记
1.每个对象都具有一个名为__proto__的属性;
2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);
3.每个对象的__proto__属性指向自身构造函数的prototype;
思路扩展如下
1 function Fun(){
2 }
3 // 我创造了一个函数Fn
4 // 这个函数由Function生成(Function作为构造函数)
5 var fn=new Fun()
6 // 我创建了一个函数fn
7 // 这个函数由Fn生成(Fn作为构造函数)
8
9
10 console.log(fn.__proto__===Fun.prototype) //true
11 // fn的__proto__指向其构造函数Fun的prototype
12 console.log(Fun.__proto__===Function.prototype) //true
13 // Fun的__proto__指向其构造函数Function的prototype
14 console.log(Function.__proto__===Function.prototype) //true
15 // Function的__proto__指向其构造函数Function的prototype
16 // 构造函数自身是一个函数,他是被自身构造的
17 console.log(Function.prototype.__proto__===Object.prototype) //true
18 // Function.prototype的__proto__指向其构造函数Object的prototype
19 // Function.prototype是一个对象,同样是一个方法,方法是函数,所以它必须有自己的构造函数也就是Object
20 console.log(Fun.prototype.__proto__===Object.prototype) //true
21 // 与上条相同
22 // 此处可以知道一点,所有构造函数的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身)
23 console.log(Object.__proto__===Function.prototype) //true
24 // Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype
25 console.log(Object.prototype.__proto__===null) //true
26 // Object.prototype作为一切的源头,他的__proto__是null
27
28 // 下面是一个新的,额外的例子
29
30 var obj={}
31 // 创建了一个obj
32 console.log(obj.__proto__===Object.prototype) //true
33 // obj作为一个直接以字面量创建的对象,所以obj__proto__直接指向了Object.prototype,而不需要经过Function了!!
34
35 // 下面是根据原型链延伸的内容
36 // 还有一个上文并未提到的constructor, constructor在原型链中,是作为对象prototypr的一个属性存在的,它指向构造函数(由于主要讲原型链,这个就没在意、);
37
38 console.log(obj.__proto__.__proto__===null) //true
39 console.log(obj.__proto__.constructor===Object) //true
40 console.log(obj.__proto__.constructor.__proto__===Function.prototype) //true
41 console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype) //true
42 console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null) //true
43 console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype) //true
44
45
46 // 以上,有兴趣的可以一一验证 F12搞起.
为了方便记忆可以得出如下结论(如有错误欢迎斧正.....)
prototype是构造函数独有的属性;
对象的__prototype__属性通常与其构造函数的prototype属性相互对应;
所有构造函数的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身);
需要注意的指向是
Function的__proto__指向其构造函数Function的prototype;
Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;
Function.prototype的__proto__指向其构造函数Object的prototype;
Object.prototype的__prototype__指向null(尽头);
在文章结构顺便附送上俩个与原型链相关的方法....欢迎使用
1.
括号内必须要加引号,并且直接写入属性名

JS对象、原型
Q&A:
1. OOP 指什么?有哪些特性
- OOP,即Object Oriented Programming,面向对象编程,是计算机的一种编程架构,OOP的一条基本规则是,计算机程序由能够起到子程序作用的单个或对象组合而成。包含属性和方法的对象是类的实例,而JS中没有类的概念,而是直接使用对象实现编程任务。
- 特性:
- 封装:能够将一个实体的信息、功能、响应都装在一个单独对象中的特性;使编程过程不必拘泥于原理,而是重在实现;
- 继承:在不改变源程序的基础上进行扩充,原功能得以保存,并且子程序能对其进行扩展,避免编写重复代码,提高工作效率;
- 多态:允许将子类类型的指针赋值给父类类型的指针;原生JS是弱类型语言,没有多态概念。
2. 如何通过构造函数的方式创建一个拥有属性和方法的对象?
由于函数也是对象的一种,所以继承了对象原型,可以对其添加属性和方法,构造函数也是函数,所以用自定义函数的方式,并将首字母大写以明确是构造函数即可,可以用new操作符创建函数实例验证。
function Person(name) {
this.name = name;
this.sayName = function() {
console.log(this.name);
}
}
3. prototype 是什么?有什么特性
- prototype,即原型,每创建一个函数都会有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
特性:让所有对象实例共享原型对象所包含的属性和方法:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
}
var p1 = new Person('zhao'),
p2 = new Person('kevin'); p1.sayName();
p2.sayName();
prototype
4. 画出如下代码的原型图
<script>
function People(name) {
this.name = name;
this.sayName = function() {
console.log('my name is:' + this.name);
}
}
People.prototype.walk = function() {
console.log(this.name + 'is walking');
}
var p1 = new People('饥人谷');
var p2 = new People('前端');
</script>
5. 以下代码中的变量age有什么区别
function People() {
var age = 1;
this.age = 10;
}
People.age = 20;
People.prototype.age = 30;
var age = 1:age为局部变量;this.age = 10:函数调用时,age为this指向对象的属性;People.age = 20:构造函数的age变为20;People.prototype.age = 30:原型添加age属性;
Coding:
1. 创建一个 Car 对象,拥有属性name、color、status;拥有方法run,stop,getStatus
function Car(name, color, status) {
this.name = name;
this.color = color;
this.status = status;
}
Car.prototype = {
constructor : Car,
run: function() {
this.status = 'run';
},
stop: function() {
this.status = 'stop';
},
getStatus: function() {
console.log(this.status);
}
}
var car1 = new Car('BMW', 'red', 'stop');
********转载:https://www.cnblogs.com/libin-1/p/6014925.html
JS原型链中的prototype与_proto_的个人理解与详细总结的更多相关文章
- 关于JS中原型链中的prototype与_proto_的个人理解与详细总结
一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我 ...
- JS中原型链中的prototype与_proto_的个人理解与详细总结(**************************************************************)
一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我 ...
- JS中原型链中的prototype与_proto_的个人理解与详细总结
1.对象的内部属性[[prototype]]和属性__proto__:每个对象都具有一个名为__proto__的属性: 2.函数的属性prototype:每个构造函数(构造函数标准为大写开头,如Fun ...
- 原型链中的prototype、__proto__和constructor的关系
先来看一张图,这张图可以说是围绕以下代码完整的描述了各对象之间的关系.接下来我们来看看如何一步步画出这张图. function Foo(){}; var foo = new Foo(); 首先,明确几 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- js原型链理解(2)--原型链继承
1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...
- 探索js原型链和vue构造函数中的奥妙
这篇文章首先会讲到原型链以及原型链的一些概念,然后会通过分析vue的源码,来看一下vue的构造函数是如何被创建的,now we go! 一.什么是原型链? 简单回顾下构造函数,原型和实例的关系: ...
- js delete删除对象属性,delete删除不了变量及原型链中的变量
js delete删除对象属性,delete删除不了变量及原型链中的变量 一.delete删除对象属性 function fun(){ this.name = 'gg'; } var obj = ne ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
随机推荐
- Python函数之返回值、作用域和局部变量
一.函数返回值 说到返回值,相信大家肯定都认识,没错,就是return. 所谓返回值可以这样理解:函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回. 那具体怎么用呢?接 ...
- validate 不校验的解决办法
最近使用validate.js用于项目的表单校验,调了半天,怎么都不校验,仔细对照例子发现 例子中要校验的文本框除了ID外还有name属性,而我在做的时候没有name属性,到这里终于 看到了希望,把所 ...
- 599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
[抄题]: Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of fa ...
- c语言打印空白星号矩形
用户输入一个数字N,输出一个N*N的空心矩形,N最小为3 效果如下: 思路是这样的,首先拿到这道题是没有思路的,但我们可以举几个例子,当N等于3的情况,当N=5的情况,发现第一行和最后一行是相同的,而 ...
- 专题2-通过按键玩中断\2440按键中断编程lesson2
1.程序优化 修改Makefile 把main.c里面的mmu代码复制到mmu.c并修改如下 main.c的修改 由于在bootloader当中一般不会使用MMU,所以 main.c 加入led.c文 ...
- 2012年长春网络赛(hdu命题)
为迎接9月14号hdu命题的长春网络赛 ACM弱校的弱菜,苦逼的在机房(感谢有你)呻吟几声: 1.对于本次网络赛,本校一共6名正式队员,训练靠的是完全的自主学习意识 2.对于网络赛的群殴模式,想竞争现 ...
- css总结7:盒子模型理解
1 盒子模型 1.1盒子模型的盒子: 以博客园页面为例: 1.2盒子内部构造:边框(border).内容(content).填充(padding).边界(margin)---CSS盒子模式都具 ...
- Linux基础-工作中经常使用到的linux 命令
linux 常用命令 (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.d ...
- MYSQL常用日期操作
mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...
- python 测试报告发送邮件
使用过程成出现的如下错误 smtplib.SMTPDataError: (554, 'DT:SPM 126 smtp5错误解决办法 1.自动化测试中,调用邮件模块自动发送邮件时,运行脚本报错: s ...