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,它是没有任何原型的。

时间: 2024-10-12 20:17:06

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

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

创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8"> <script type="text/javascript"> Animal = function(tail){ this.tail = tail || &

Javascript中的prototype与继承

通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性. prototype属性之所以特别,是因为javascript时读取属性时的遍历机制决定的.本质上它就是一个普通的指针. 构造器包括: 1.Object 2.Function 3.Array 4.Date 5.String 下面我们来举一些例

javascript继承—prototype属性介绍(2)

js里每一个function都有一个prototype属性,而每一个实例都有constructor属性,并且每一个function的prototype都有一个constructor属性,这个属性会指向自身.这会形成一个非常有意思的链式结构.举例如下: function Person(){ this.name =12; } console.log(Person.prototype); console.log(Person.prototype.constructor);//输出Person,指向自身

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

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,JavaScript语言描述起来有些力不从心了.在开源社区中John Resiq在他的博客(http://e

Cocos2d-JS中JavaScript继承

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,JavaScript语言描述起来有些力不从心了.在开源社区中John Resiq在他的博客(http://e

JavaScript——中的prototype(原型)

JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javascript的方法可以分为三类: a 类方法 b 对象方法 c 原型方法 例子: function People(name){  this.name=name;  //对象方法  this.Introduce=functi

理解javascript中的prototype

以前一直对javascript中的prototype不是很理解,今天在阅读了<javascript高级程序设计之后>终于理解了其中的prototype.来简单的总结一下从书中学习到的内容. 我们都知道在创建了一个function之后,这个function就具有了prototype这样的一个属性,利用这个prototype我们可以做很多的事情,其中我们经常用到的一点就是利用它来当做构造函数,因此,本文重要从function作为构造函数的角度来说明一下prototype. 其实javascript

javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) - jssl915

一.利用空函数实现继承 参考了文章javascript继承-prototype属性介绍(2) 中叶小钗的评论指点,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权属性和特权方法,私有属性,私有方法的空耗资源问题. function Person(name,age){ this.name = name; this.age = age; } Person.prototype = { constructor:Person, sayHi:function(){

深入理解Javascript中this, prototype, constructor

在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则this为当前页面对象window;如果在函数中使用this,则this为调用该函数的对象;可以使用apply和call两个全局函数来改变this的指向. 接下来,首先通过几个demo程序验证一下: function testFunction(){ console.log(this.variable