视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
对JS的继承的理解
2020-11-27 19:36:45 责编:小采
文档


js的原型继承

原型链是实现js继承的主要方法,他的原理是让利用原型让一个引用类型继承另一个引用类型的属性和方法。如果我们让一个原型对象等于一个实例,那么,此时的原型对象将包含指向另一个原型的指针假如另一个原型又等于一个对象的实例,如此一层套一层,这就是原型链的基本概念。

下边是一个简单的例子

 var Parent = function(){
 this.name = 'parent' ;
 } ;
 Parent.prototype.getName = function(){
 return this.name ;
 } ;
 Parent.prototype.obj = {a : 1} ; var Child = function(){
 this.name = 'child' ;
 } ;
 Child.prototype = new Parent() ; var parent = new Parent() ; var child = new Child() ;
 console.log(parent.getName()) ; //parent
 console.log(child.getName()) ; //child

以上代码定义了两个类型:parent和chiled。每个类型都有一个属性和方法,他们主要的区别就是child继承了parent,继承是通过创建parent的实例,并把这个实例赋给child.prototype实现的
实现的本质是重写了原型链对象,取代他的是新的实例。直接把父类的对象赋值给子类构造函数的原型,这样子类的对象就可以访问到父类以及父类构造函数的prototype中的属性。
我们可以用instanceof操作符判断,用这个操作符测试实例和原型链中出现过的构造函数,就返回true


借用构造函数

什么是构造函数

JavaScript的构造函数并不是作为类的一个特定方法存在的;当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。一个函数要作为一个真正意义上的构造函数,需要满足下列条件:

1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。

2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
关于JavaScript的构造函数,有一个容易混淆的地方,那就是原型的constructor属性。在JavaScript中,每一个函数都有默认的原型对象属性prototype,该对象默认包含了两个成员属性:constructor和proto。关于原型的细节就不在本文赘述了,我们现在关心的是这个constructor属性。

按照面向对象的习惯性思维,我们说构造函数相当于“类”的定义,从而可能会认为constructor属性就是该类实际意义上的构造函数,在new表达式创建一个对象的时候,会直接调用constructor来初始化对象,那就大错特错了。new表达式执行的实际过程已经在上文中介绍过了(四个步骤),其中用于初始化对象的是第三步,调用的初始化函数正是“类函数”本身,而不是constructor

 function CO(){
 this.p = “I’m in constructed object”; this.alertP = function(){
 alert(this.p);
 }
 } var o2 = new CO();

借用构造函数继承

这个基本思想很简单,也就是在子类型构造函数的内部调用超类型构造函数。因为函数只不过是在特定环境中执行代码的对象,因此可以通过使用apply()和call()方法也可以在新创建的对象上执行的构造函数。

 function superType(){
 this.colors = ["red","blue","green"];
 } function subtype(){
 superType.call(this);
 } var instance1 = new subtype();
 instance1.colors.push("black");
 alert(instance1.colors);//"red,blue,green,black"
 var instance2 = new subtype();
 alert(instance2.colors);//"red,blue,green"

通过使用call(),我们实际上是在新创建的subtype实例环境下调用了supertype()构造函数,这样一来,就会在新subtype对象上执行supertype构造函数,因此就会在subtype对象上执行supertype()函数中定义的所有对象初始化代码

 function superType(name){
 this.name = name;
 } function subtype(){
 superType.call(this,"Marry"); this.age = 29;
 } var instance = new subtype();
 alert(instance.name);//"Marry"
 alert(instance2.age);//"29"

这是构造函数的一个很大的优势,可以在子类型构造函数中向超类型构造函数传递参数。

本文讲解了JS的继承的理解,更多相关内容请关注Gxl网。

相关推荐:

JS解密,在线JS解密解密

如何优化JS代码

JavaScript之本地对象

下载本文
显示全文
专题