JavaScript 继承代码中,B.prototype = new A(); 的含义是什么?[转自知乎]
假设有如下代码:
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(); 的含义是什么?[转自知乎]的更多相关文章
- 《ext江湖》第8章继承-代码片段
创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content ...
- Javascript中的prototype与继承
通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
- JavaScript强化教程——Cocos2d-JS中JavaScript继承
javaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...
- Cocos2d-JS中JavaScript继承
JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...
- JavaScript——中的prototype(原型)
JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...
- Javascript中的prototype和__proto__的联系区别
转载至http://www.cnblogs.com/sinstone/p/5136871.html 一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...
- javascript继承—prototype最优两种继承(空函数和循环拷贝)
一.利用空函数实现继承 参考了文章javascript继承-prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...
- 深入理解Javascript中this, prototype, constructor
在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则 ...
随机推荐
- tipsText表单验证(注册)
注册表单验证脚本 <script src="/assets/skins/js/jquery-1.11.2.min.js"></script> <scr ...
- 【codeforces 801A】Vicious Keyboard
[题目链接]:http://codeforces.com/contest/801/problem/A [题意] 一个字符串只由VK组成; 让你修改一个字符; 使得剩下的字符串里面子串VK的个数最大; ...
- [TYVJ1730]二逼平衡树
[TYVJ1730]二逼平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查 ...
- MVC.Net:添加第三方类库的bundles引用
以jQuery Mobile为例.当我们用nuget添加jQuery Mobile的package后,需要在项目中引用jQuery Mobile.传统的做法是在html页面上添加 <link h ...
- source 命令的用法,是在当前bash环境下执行脚本文件
原文: http://www.cnblogs.com/softwaretesting/archive/2012/02/13/2349550.html source命令用法: source FileNa ...
- 【转】php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
原文:https://my.oschina.net/CuZn/blog/68650 当php.ini配置文件中的 设置开启的时候,就相当于PHP已经打开了最顶层的 一级缓存 (等价于调用了一次 ob ...
- ubuntu系统启动qtceator时提示:Qt5.5.1/Tools/QtCreator/lib/qtcreator/plugins/libHelp.so: 无法加载库
在ubuntu系统下安装好qt5.5后启动qtceator时提示:Qt5.5.1/Tools/QtCreator/lib/qtcreator/plugins/libHelp.so: 无法加载库Qt5. ...
- 一个jeecg整合activiti的学习样例,源代码下载
社区成员:刘京华採用技术:jeecg+ activiti源代码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示: 2.jpg (71.81 KB, 下载次数: 0) ...
- Android面试常问的技术问题
面试时技术经理会问你一些工作中遇到的Android方面的问题.谈谈你所做的项目,和在项目中所扮演的角色. 很多其它内容请參考我的博客:点击打开链接 1.怎样优化ListView? ①Item布局,层级 ...
- Middle-help 终极实现元素水平垂直居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...