js里面的继承该怎么理解,原型链是什么概念,这方面的内容很重要么
发布网友
发布时间:2022-04-22 09:47
我来回答
共3个回答
热心网友
时间:2022-04-22 11:16
简单来说 继承 就是一个类B 是由另一个类 A 继承来的, 那么 B在一开始就拥有了A 的所有属性和方法, 类B 自己在增加一些属性和方法 后 后来的类C 继承自类 B , 那么 类 C 一开始 就拥有了 类A 的 所有属性和方法 和 类 B 新加的属性和 方法 , 同理 继承类c 的的 也拥有 a b c 的属性和方法 ;
上例中 : c 是D的原型 , B 是 C的原型 , A 是B 的原型 , 这就是原型链 .
这方面的内容 很重要; 因为在程序开发中 要完成一个复杂的功能 都是把复杂的功能分解成一个个简单的小块 , 一路继承下去 直到完成所有功能,
比如说要接收一篇文章, 首先做出一个类A 来接收一个字母 , 再 是类B 接收 一个单词, 接下来一个类 C 接受一行, 最后是类 D 接受整片文章.
热心网友
时间:2022-04-22 12:34
先来看一下原型
JavaScript的所有function类型的对象都有一个prototype属性,这个prototype属性本身
是一个object类型的对象,因此我们也可以给这个prototype对象添加任意的属性和方法。
先看以下代码
<script type=”text/javascript”>
Person = function(){
this.name = “jack”;
};
Person.prototype.name = “rose”;
p = new Person();
alert(p.name);//输出jack
delete p.name;
alert(p.name);//输出rose
</script>
由此可见当我们调用p.name时首先到p对象内部去查找name属性如果没有就去p对象的原型(prototype)中去查找name属性再来看以下代码
<script type=”text/javascript”>
Person = function(){
this.name = "jack";
};
Employee = function(){
this.name = "emp";
};
1 Employee.prototype = new Person();
2 Employee.prototype.name = "protoName";
Person.prototype.name = "rose";
e = new Employee();
alert(e.name);//输出emp
delete e.name;
alert(e.name);//输出protoName
delete Employee.prototype.name;
alert(e.name);//输出rose
</script>
上面这段代码可以看出调用e.name 首先到e对象内部查找可以找到emp,删除后然后到e对象的原型中(prototype)去查找name属性此时找到protoName再删除,此时发现程序执行的流程是到Person的原型中去找出了rose, 由此可见代码行1中Employee的原型关联到了Person,相当于Person是Employee的父类。
读者可能会发现上面这段描述写的很敷衍
为什么顺序不是这样
e对象内部->e对象原型->person对象内部->person对象原型
而是
e对象内部->e对象原型-> person对象原型
其实关键就在于1、2两行代码
做个实验
调换1、2两行代码的位置
即
2 Employee.prototype.name = "protoName";
1 Employee.prototype = new Person();
再运行看看结果
alert(e.name);//输出emp
delete e.name;
alert(e.name);//输出jack
delete Employee.prototype.name;
alert(e.name);//输出rose
</script>
这种输出结果就好像如下顺序
e对象内部-> person对象内部->person对象原型
如果你是真心想学习JS、以后想朝着这个方向发展,那么你一定要来这个企鹅裙,前面前面是2九六,中间是五九一,最后面就是2九零,连起来就是完整的了,来这里可以这里学习经验,得到专人解答,这样你可以成长的更快!!!
为什么有这样的区别,关键就是这句话
Employee.prototype = new Person(); Employee的原型对象被赋值成了一个Person对象即Employee的原型被修改了,那么写在这句前面的Employee.prototype.name ="protoName";就没有用了和删除这句话效果一样
那么Employee.prototype.name也就理所应当等于person对象的name 给Employee.prototype.name赋值也就相当于给person对象的name属性赋值那么原来的jack就被覆盖了原型链就是prototype对象的一条关系链这条链的末端就是Object对象的原型当调用对象的属性或方法时首先会去对象内部查找,然后再依次顺着原型链条一直找到Object
热心网友
时间:2022-04-22 14:09
继承字面意思是 子集继承父集所有特性并且还具备自己的特性。 并且支持有多个爹 。😄