文档章节

JavaScript中的继承之借用构造函数

Marychain
 Marychain
发布于 2016/04/16 11:21
字数 427
阅读 94
收藏 0

借用构造函数是为了解决引用值类型被所有实例共享的问题。

基本思想是:在子类型构造函数内部通过apply()或call()方法调用超类型的构造函数,也可以在将来新创建的对象上执行构造函数

先看一个例子:

function superType(){
     this.colors = ['red','blue','green'];      
}

function subType(){
    //继承了superType 
   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

 

 superType.call(this)这句实际上是在(未来将要)新创建的subType实例的环境下调用了superType构造函数。调用这句之后,会在新subType对象上执行superType()函数中定义的所有对象初始化代码(非私有变量或私有函数,即只调用前面加this的属性和函数)。因为此属性并非是原型对象上的属性所以不会被所有实例共享,所以每创建一个实例,都会拥有一个colors属性的副本。

更好的一点是,可以在子类型构造函数中向超类型构造函数传递参数。

看下面这个例子。

function superType(name){
     this.name = name;       
}

function subType(age){
    //继承了superType,同时还传递了参数
    superType.call(this,"Nico");
    //实例属性
    this.age = age;     
}
 
var instance =  new subType(20);
alert(instance.name)  //"Nico"
alert(instance.age) //20

 

  

借用构造函数的问题:

方法都在构造函数中定义,无法做到函数复用。而且,在超类的原型中定义的方法,对子类型而言都是不可见的,结果所有类型都只能使用构造函数模式。

 

© 著作权归作者所有

Marychain
粉丝 1
博文 20
码字总数 10134
作品 0
日本
程序员
私信 提问
JavaScript 继承的那些事

原本地址:http://www.ahonn.me/2017/01/2... 众所周知,JavaScript 的继承是实现继承,而没有 Java 中的接口继承。这是因为 JavaScript 中函数没有签名,而实现继承依靠的是原型链来实现的。...

Ahonn
09/29
0
0
JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
01/20
26
0
JS 总结之原型继承的几种方式

在之前的总结中,我们详细分析了原型《JS 总结之原型》,原型很大作用用于模拟继承,这一次,我们来聊原型继承的几种方式。 🌶 前提 以一个父类为前提条件,列举 js 继承的继承方式: 🍖...

Karon_
2018/12/24
0
0
[面试专题]js之面向对象(OOP)

js之面向对象(OOP) js对象类型(Object) js数据类型分六类,简单类型:Undefined,Null,Bollean,Number,String五种,复杂类型:Object. 其中Undefined、Null、Boolean、Number也属于基本类型。Obj...

逺方小鎭
09/29
0
0
JavaScript 中的继承:ES3、ES5 和 ES6

选择一种继承方式 JavaScript 是一门动态语言,动态意味着高灵活性,而这尤其可以体现在继承上面。JavaScript 中的继承有很多种实现方式,可以分成下面四类: Mixin 模式,即属性混入,从一个...

天方夜
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于java中变量的重名问题

在java语言中,变量的命名有很多规则和规范,但是有的地方可以使用相同的变量名,有的地方却不能使用,这是为什么呢? 下面是个人的一点见解,是从作用域和内存来分析的,目的是为了方便理解...

INEVITABLE
18分钟前
4
0
MySQL的COUNT语句,竟然都能被面试官虐的这么惨?

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,...

程序员修BUG
20分钟前
4
0
PHP+Mysql统计文件下载次数实例

PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数。 获取文件列表: <?php require 'conn.php'; $query = mysql_query("S...

ymkjs1990
21分钟前
3
0
一、环境变量及Jshell

一、环境变量: 作用: 可执行文件所在位置的链接。CLI输入命令时,通过环境变量指引找到命令所在位置 windows的环境变量名不区分大小写,Linux区分 Windows下的用户变量即只有当前用户生效 ...

清自以敬
22分钟前
4
0
微软改名部又出手:Office 365正在悄悄更名为Microsoft 365

然而让人疑惑的是Microsoft 365 是微软面向企业提供的服务,这项服务附带操作系统以及办公软件的订阅授权。 现在把面向家庭消费者的办公软件也换成Microsoft 365 是什么操作?没人知道因为微...

linuxCool
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部