JavaScript 继承代码中,B.prototype = new A(); 的含义是什么?[转自知乎]

摘要:
假设以下代码:functionA(){this.name=“A”}functionB(){this.name=“B”}A.原型。whatever=function(){/*somecode*/};此时,B应该继承A,使用B。prototype=newA();B、 原型。构造函数=B;我想知道为什么B.prototype=newA();代替B.pro

假设有如下代码:

function A() {this.name = "A"}
function B() {this.name = "B"}
A.prototype.whatever = function() {/* some code */};

这个时候要使 B 继承 A,用

B.prototype = new A();
B.prototype.constructor = B;

我想知道,这里为啥是 B.prototype = new A(); 而不是 B.prototype = A or B.prototype = A.prototype?
又有:

var c = new A();
var b = new B();

既然 c == B.prototype == new A(); 那 b 和 c 是什么关系啊?


作者:李引证
链接:http://www.zhihu.com/question/20801227/answer/16239270
来源:知乎

1.为啥是 B.prototype = new A(); 而不是 B.prototype = A or B.prototype = A.prototype?
要实现继承,就必须保证B继承A以后,B所做的修改不能影响到A以及继承自A的其它对象。
如果B.prototype = A的话,那么着两个对象的引用是完全一致了,这样的话,如果赋值 B.prototype.name=45455;那么A.name就直接变成45455;
直接把A和继承自A的其它对象全部改了,这根本谈不上继承。
至于B.prototype = A.prototype也是同理,修改B的原型就会直接把A的原型给污染掉。
B.prototype = new A();这个方法,是创建了一个新的对象{},并且继承了A的原型,这是一个新对象,不是和A同一引用,所以不会污染A。
我们先把B.prototype改成另外一个名字,叫XXX,此时XXX=new A();
当你请求XXX. whatever的时候,此时它不存在,将会向上从构造函数,也就是A()里找
也就是B.prototype. whatever ==XXX. whatever ==A.prototype.whatever
这就顺利的请求到了值,而且不会污染A。

B.prototype.constructor = B;
这行是把B的constructor重新设为B,不然的话它就会变成A

2.var c = new A();这行,它是一个新的继承对象。
虽然上面定义了B.prototype=new A(); 但是B.prototype和C不相等,它们是两个完全不同的对象
如果想让它们相等的话,也就不用做继承了……直接赋值给它引用就行了嘛

var c = new A();
var b = new B();

这个是原型链的经典。
我想请求一个b.whatever
那么首先它在b对象里找,没找到。
然后它去b的构造函数B.prototype里找,这个时候也没有
于是它就去B.prototype的构造函数A里找,终于找到A.prototype.whatever,于是它返回给B.prototype. whatever,再返回给b.whatever
这就实现了原型链的继承关系。
b.whatever==B.prototype.whatever==A.prototype.whatever
其目的在于,B完全继承A的东西,只要A原型里有的,B的实例(通过new B产生的)都可以拿到。
但修改实例的属性和方法不会影响类(好吧,js没有这两个词,意思差不多)
修改子类的属性和方法不会影响父类(好吧,js没有这两个词,意思差不多)
不同实例之间是不同的对象,并不相等。
3.继承和实例的区别很好理解,你上面那个,c就是A的实例,B就是A的继承,他们之间还是有很大区别的。
B 可以被当作构造函数被实例化,此时B的实例可以获取到父类A的属性以及方法。
而c这个A的实例却不能被实例化,即不能用 xxx=new c();
B的原型完全照搬了A,也就是B.prototype和A的原型一样。
c没有prototype,它是没有任何原型的。

免责声明:文章转载自《JavaScript 继承代码中,B.prototype = new A(); 的含义是什么?[转自知乎]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux进程调度与源码分析(三)——do_fork()的实现原理ADB server didn't ACK的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

毫米雷达波概述

毫米波雷达1.毫米波雷达的应用与特点1)车载毫米波雷达研究意义随着现代科学技术的快速发展以及人们生活水平的显著提高,车辆的使用量急剧增加,相应的交通事故也急剧上升。2)车载毫米波雷达特点汽车防撞雷达主要有超声波雷达、激光雷达、毫米波雷达等类型。基带信号处理部分主要是算法,是毫米波雷达稳定性、可靠性的核心。...

Wayland 源码解析之代码结构

Wayland实现的代码组成可以分为以下四个部分:1.Wayland库的核心部分,大部分Wayland协议实现都位于该库中。1) 该工具程序分析Wayland协议文件并生成相应的头文件和代码文件。源代码文件列表:wayland/cursor/wayland cursor。通道/光标/通道光标。cwyland/cursor/os兼容性。cwyland/curs...

html2canvas踩坑日记

在html2canvas<html2canvas(document.querySelector(“#capture”)).then(canvas=>{document.body.appendChild(canvas)});//图片地址是文档。身体appendChild(画布);...

IOS崩溃日志解析(crash log)

IOS的应用程序少不了crash,互联网统计分析工具友盟有一项目错误分析的功能,专门用于应用程序崩溃日志统计,最近研究友盟上统计到的崩溃日志,在此对崩溃日志做一个简单的总结。否则,应用将被iOS终止,并产生低内存崩溃报告。这样,我们去我们的dSYM文件看看我们的UUID是否和崩溃日志上的UUID一致,只有dSYM文件的UUID和崩溃日志上的UUID一致,我们...

Spark 数据读取与保存(输入、输出)

SaveAsTextFile(字符串)scala&gt:importsscala.util.parsing.json.json(2)将json文件上载到HDFS[lxl@hadoop102spark]$hadoopfs投入。/示例/src/main/resources/people。json/(3)读取文件scala>...

C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)

//Www.cnblogs.com/Maxq/p/6566558.htmlWebKit.net是WebKit的一个net包。使用它,。net程序可以非常方便地集成和使用webkit作为加载网页的容器。EventArgse){WebKit.WebKitBrowser=newWebKitBrowser();this.Controls.Add(浏览器);...