JavaScript 继承代码中,B.prototype = new A(); 的含义是什么?[转自知乎] 需要多回味
来源:互联网 发布:mysql qps 编辑:程序博客网 时间:2024/05/19 11:50
假设有如下代码:
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(); 的含义是什么?[转自知乎] 需要多回味
- 进程和线程的区别是什么(转自知乎)
- 程序员需要关注的那些网站(转自知乎)
- a+++++b的含义是什么?
- 如何写出易于维护的代码,转自知乎
- javascript 中new的含义
- 来自知乎-Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?
- 失眠 的解决方案—转自知乎
- 转自知乎的吉他学习篇
- 【转自知乎】简单明了的解释傅里叶变换
- Github的基本功能(转自知乎)
- javascript this指代,new的含义以及prototype,原型链
- 转自知乎
- 转自知乎
- JavaScript的prototype是什么
- Javascript中继承和Prototype的关系
- Javascript中继承和Prototype的关系
- Javascript中继承和Prototype的关系
- SVN
- 我来了,哈哈
- nodejs破解12306心得
- 关于BuildNumberIncreaser.dll注册的问题
- python 赋值、浅拷贝与深拷贝
- JavaScript 继承代码中,B.prototype = new A(); 的含义是什么?[转自知乎] 需要多回味
- 时间格式、比较等(1)
- Linux环境下mysql数据库定时备份
- Java-泛型
- 点击按钮后台生成桌面快捷方式
- 友盟分享本地图片到微信无法调起微信解决方案
- MFC文件的写入以及写出????
- 顺序表右移K位
- 面试总结