问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JavaScript里面的子类和父类是什么意思?

发布网友 发布时间:2022-05-18 02:47

我来回答

3个回答

懂视网 时间:2022-05-18 07:08

在JavaScript中,可以使用类(Class)来实现面向对象编程(Object Oriented Programming)。不过,JavaScript中的类与Java中的有所不同,其相应的定义和使用也不一样。

JavaScript中类的定义

在JavaScript中,所有从同一个原型对象(prototype)处衍生出来的对象组成了一个类;也就是说,JavaScript中的类是一个对象集合的概念,如果两个对象它们的prototype相同,那么它们就属于同一个类;JavaScript中的类甚至都不需要类名。以下面的代码为例:

代码如下:
var p = {x:42};
var a = Object.create(p);
var b = Object.create(p);
console.log(a === b);//false
console.log(Object.getPrototypeOf(a) === Object.getPrototypeOf(b));//true

在上述例子中,对象a和b拥有相同的原型对象(prototype) p,因此a和b属于同一个类(虽然这个类都没有类名),它们从原型对象p处继承了值为42的属性x。

从这个例子中可以看到,原型对象的作用就相当于模板,可以由之衍生/创建出多个对象,其地位与Java语言中的类代码(Class code)相同,是JavaScript中类定义的核心。以下这个例子中的原型对象就呈现出更像类代码的样子:


代码如下:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x + this.INCREMENT_BY;
}
}
var a = Object.create(p);
var b = Object.create(p);
console.log(a.increment(7));//8
console.log(b.increment(9));//10


上述例子中,原型对象p定义了一个值为1的property (INCREMENT_BY)和一个名为increment的函数;对象a和b从p这个模板处获取了INCREMENT_BY和increment函数。当调用对象a或b的increment函数时,JavaScript会试图获取a或b的INCREMENT_BY值(this.INCREMENT_BY);由于INCREMENT_BY是从p中获取的,因此其值都是1 — 从模板中获取的,值都相同的变量,类似于Java中的静态类变量(static variable),因此上面的例子中对INCREMENT_BY变量命名时使用了全大写字符。

在上面的例子中,所有从模板p处创建出来的对象(属于同一个类的这些对象),其属性和行为都是一模一样的。但实际上对于同一个类的不同对象,它们除了拥有类所定义的属性/行为以外,往往具有一些自身所特有的属性与行为。因此,如果需要将prototype这个模板当作类来使用的话,就必须对每一个从中衍生出来的对象进行一定的定制:


代码如下:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x + this.INCREMENT_BY + this.custom_increment_by;
}
}
var a = Object.create(p);
var b = Object.create(p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
console.log(a.increment(7));//8
console.log(b.increment(9));//11


在这个例子中,从模板p处创建出来的对象a和b拥有一个彼此间值不一定相等的变量custom_increment_by,而它们的increment()函数这个行为的最终结果则与custom_increment_by的值相关。一般来说,对新建对象进行定制化的工作往往放在统一的函数中进行:


代码如下:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x + this.INCREMENT_BY + this.custom_increment_by;
}
}
function getIncrementalClassObject(customIncrementByValue){
var incrementalObj = Object.create(p);
incrementalObj.custom_increment_by = customIncrementByValue;
return incrementalObj;
}
var a = getIncrementalClassObject(0);
var b = getIncrementalClassObject(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11


如此,便通过原型对象p和getIncrementalClassObject()函数完成了一个类的定义:可以通过调用getIncrementalClassObject()函数来获取原型对象都是p的对象,而在调用getIncrementalClassObject()函数过程中可以对这些新建对象进行一定的定制化。值得注意的是,此时这个已经定义了的类还没有类名,为了方便描述,姑且称之为Incremental。

回顾getIncrementalClassObject()函数中所做的工作,可以看到从Incremental这个类中创建新的对象所经历的过程如下:

1.创建一个空对象,并将其原型对象定义为p。
2.根据不同的参数值,对这个新建的空对象进行定制。
3.返回已经定制完成的新对象。

在JavaScript中,可以通过使用Constructor(构造函数)来快速地完成类的定义以及新对象的创建。

JavaScript中的Constructor(构造函数)

从上述Incremental类这个例子中可以看到,定义新的类需要两部分代码:创建原型对象作为模板、创建自定义函数对新对象进行初始化;而从类中创建新的对象则经历了三个过程:指定新对象的原型对象、定制/初始化新对象、返回这个新对象。在JavaScript中,这一切都可以通过Constructor(构造函数)来完成。

JavaScript中的Constructor是一个函数(function),承担对新对象进行初始化的职责;而这个Constructor函数的prototype则作为模板用于创建新对象。仍以上述Incremental类为例,用Constructor来重写代码后是这样的:


代码如下:
function Incremental(customIncrementByValue){
this.custom_increment_by = customIncrementByValue;
}
Incremental.prototype = {
INCREMENT_BY : 1,
increment : function(x){
return x + this.INCREMENT_BY + this.custom_increment_by;
}
}

var a = new Incremental(0);
var b = new Incremental(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11

通过new关键词,使用Constructor函数来创建新对象这一过程,其实际上经历了以下几个阶段:

创建一个新的空对象。

1.将这个对象的原型对象指向constructor函数的prototype属性。
2.将这个对象作为this参数,执行constructor函数。
3.这与之前的getIncrementalClassObject()函数中所做的工作是一样的。

类名

在使用Constructor创建对象时,相应的对象也就有了“类名”,这可以从instanceof操作符的结果上得到验证:
代码如下:
console.log(a instanceof Incremental);//true
console.log(b instanceof Incremental);//true

不过,instanceof操作符并不判断对象是否由Incremental这一构造函数所创建,instanceof操作符只判断对象的原型对象是否为Incremental.prototype。当存在两个prototype一样的构造函数时,instanceof操作符将统一返回true,而不会区分用于创建对象的构造函数到底是哪个。
代码如下:
function Incremental2(customIncrementByValue){
this.custom_increment_by = customIncrementByValue + 3;
}
Incremental2.prototype = Incremental.prototype;
console.log(a instanceof Incremental2);//true

热心网友 时间:2022-05-18 04:16

js是通过prototype实现的继承,
如ClassA.prototype = new ClassB().
就可以说ClassA是ClassB的子类,同时ClassB是ClassA的父类

js中定义一个class其实就是一个function,如
var ClassA = function() {
}

====怎么最近好像老有人问这个?

热心网友 时间:2022-05-18 05:34

js中没有类的概念,js是基于原型继承的。“类”在js中大概就是构造函数了,通过构造函数生成新的对象,这个对象又是可以被继承的,所以js中只有对象的概念。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Hive笔记 Hive-元数据 英语low是什么意思 Low low 的是什么意思? 如何打开电脑设置的打印机电脑打印设置在哪里打开 使用电脑打印机怎么设置打印机和电脑怎样连接该如何设置 win10打印机设置在哪里 win10打印机设置方法介绍 怎么在电脑上设置打印机在电脑上怎么找打印机设置 怎样为电脑设置打印机电脑里打印机设置在哪 电脑打印机在哪里设置电脑上的打印机在哪里 市场营销干什么的? 简单点谢谢啊 请问联通4g可以边上网边打电话吗 四个月宝宝消化不良拉奶瓣吐奶瓣怎么办 求无条件为你这首歌同音的粤语版名字 歌词里有二百年之后的粤语歌是什么? 怎么用粤语向别人解释斯德哥尔摩综合症这个名词? 请问大家有什么办法用联通宽带玩电信区的游戏不卡吗 请问大神们!我现在用的是联通4兆的网线。可是英雄联盟是电信区的,用什么加速器玩游戏能不卡呢!!! 我家跨区玩QQ飞车,联通的宽带,玩电信区,延迟高,有什么办法?用什么网游加速器好? 我联通的宽带,用优顿网游加速器可以玩电信的游戏吗? 今晚上赵心童与希金比赛在那里看 大家路由器多久换 没看明白,我是OPPO手机? - 信息提示 我也是OPPO的 碰到和你一样的问题 你是怎么解决的啊 windows 10是多少位的 windows 10 是几位系统吗 windows10 是64位还是32位的 福建省今年对教师资格证的体检要求有变化吗?我两腿不等长,应该不到五厘米,走路有点跛,但身体素质一切 什么是膳食平衡养生法? 登录系统,如何查看你位于系统的哪个目录下,在这个目录下,输入ls,然后输入 ls—a有什么不一样? 支付宝转账到银行卡钱怎么不能用 支付宝转账到银行卡为什么总是用不了 建筑摄影如何摆脱古板感? 怎样拍好建筑模型照片? 恐龙有什么特征??? 第一代恐龙的特点是什么? 支付宝大学认证填写错了怎么办,而且我不是大学生 产妇乳房胀痛怎么办? 产后乳房很胀痛怎么办?焦作有没有好的催乳师? 电脑DVD光驱在读盘时声音特别大怎么办? 笔记本光驱读碟声音很大怎么回事? 为什么光驱在运行光盘的时候声音很大? 有一份有照片的表格做电子版 照片怎么弄 怎么在表格里放电子版照片 请问手机照片的表格怎么弄成电子版的,求大神帮忙。 亲们!想问下,他们喊麦的伴奏都是在哪弄的? 录制快手喊麦把麦克风与耳机一体的插入手机,用电脑播放伴奏可以吗? 100聚酯纤维是帆布吗 聚酯纤维布越南语怎么说