假设有如下代码:

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(); 的含义是什么?[转自知乎]的更多相关文章

  1. 《ext江湖》第8章继承-代码片段

    创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content ...

  2. Javascript中的prototype与继承

    通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...

  3. 谈谈javascript中的prototype与继承

    谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...

  4. JavaScript强化教程——Cocos2d-JS中JavaScript继承

    javaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...

  5. Cocos2d-JS中JavaScript继承

    JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...

  6. JavaScript——中的prototype(原型)

    JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

  7. Javascript中的prototype和__proto__的联系区别

    转载至http://www.cnblogs.com/sinstone/p/5136871.html   一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...

  8. javascript继承—prototype最优两种继承(空函数和循环拷贝)

    一.利用空函数实现继承 参考了文章javascript继承-prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...

  9. 深入理解Javascript中this, prototype, constructor

    在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则 ...

随机推荐

  1. 小白神器 - 一篇博客学会HTML

    小白神器 - 一篇博客学会HTML 一. 简介 1. HTML 定义 htyper text markup language  即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐. ...

  2. ansible plugins 列表

    [action plugins] [cache plugins]jsonfilememcachedmemorymongodbpickleredisyaml [callback plugins]acti ...

  3. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor

    There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le 1,0 ...

  4. [bzoj1925][Sdoi2010]地精部落_递推_动态规划

    地精部落 bzoj-1925 Sdoi-2010 题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数) 注释:$1\le ...

  5. linux环境下安装varnish

    Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. sudo apt-get insta ...

  6. Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

    1.首先,须要一个节点对象的类.这些对象包括数据.数据代表存储的内容,并且还有指向节点的两个子节点的引用 class Node { public int iData; public double dD ...

  7. MySQL 调优 —— Using filesort

    出现这个问题的解决办法在于 MySQL 每次查询仅仅能使用一个索引, 而你的 SQL 语句 WHERE 条件和 ORDER BY 的条件不一样, 索引没建好的话. 那么 ORDER BY 就使用不到索 ...

  8. android 通用菜单条实现(一)

    一.前言介绍 直奔主题啦,非常多Android app都有菜单条.菜单条除了背景图片.图标的不同外,布局基本一致.大致能够分为三部分:菜单条的左側区域.菜单条中间区域.菜单条右側区域. 为了考虑代码的 ...

  9. Gevent的协程实现原理

    之前之所以看greenlet的代码实现,主要就是想要看看gevent库的实现代码. .. 然后知道了gevent的协程是基于greenlet来实现的...所以就又先去看了看greenlet的实现... ...

  10. Android ListView 和 ScrollView 冲突问题

    近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控 ...