首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从子类本身获取js父类名称,而不是它的实例?

从子类本身获取父类名称,而不是它的实例,可以通过以下方式实现:

在JavaScript中,可以使用Object.getPrototypeOf()方法来获取一个对象的原型(即父类)。然后,可以使用Object.getPrototypeOf()方法再次获取父类的原型,直到获取到最顶层的原型(Object.prototype)。最后,可以使用constructor.name属性来获取原型的名称。

下面是一个示例代码:

代码语言:txt
复制
function Parent() {}

function Child() {}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

// 获取子类的原型
var childPrototype = Child.prototype;

// 获取父类的原型
var parentPrototype = Object.getPrototypeOf(childPrototype);

// 获取父类的名称
var parentName = parentPrototype.constructor.name;

console.log(parentName); // 输出 "Parent"

在上面的示例中,我们定义了一个父类Parent和一个子类Child。通过将子类的原型设置为父类的原型,并将子类的构造函数设置为子类本身,我们创建了一个继承关系。

然后,我们使用Object.getPrototypeOf()方法获取子类的原型,并再次使用该方法获取父类的原型。最后,我们使用constructor.name属性获取父类的名称,并将其打印到控制台上。

这样,我们就可以从子类本身获取父类的名称,而不是通过实例来获取。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript 完整指南

你必须构造函数代码中解密它们。 更好方法是显式声明字段。无论构造函数做什么,实例始终具有相同字段集。 字段提案允许你在主体内定义字段。...不仅如此,它还通过执行实例this.getName() 另一种方法来获取用户名。 方法也可以是私有的。可以通过前缀使方法私有,其名称以#开头。...4.3静态方法 静态方法是直接附加到函数。它们具有与相关逻辑,不是实例相关逻辑。...例如,让我们创建一个新子类 ContentWriter, 来扩展 User。...空对象 {} 不是 User 实例,对应 obj instanceof User 是 false。 instanceof 是多态:操作符将一个子类检测为实例

96520

JavaScript:prototype&apply&call

prototype继承也有四个比较明显缺点:   缺点一:构造函数不是像JAVA中那样在给子类进行实例化时执行,而是在设置继承时候执行,并且只执行一次。...这往往不是我们希望,特别是构造函数中有一些特殊操作情况下。   ...缺点二:由于构造函数不是子类进行实例化时执行,在构造函数中设置成员变量到了子类中就成了所有实例对象公有的公共变量。...缺点三:如果构造函数需要参数,我们就没有办法了。   缺点四:子类原本原型对象被替换了,子类本身constructor属性就没有了。...在实例constructor属性时,取得是从父中继承constructor属性,从而constructor值是不是子类

49921

Classes (

这个对象就是中描述所有特性一份副本。 把实例对象之间关系看作是直接关系不是间接关系通常更有助于理解。...由于 JS子类关系只存在于两者构造函数对应 .prototype 对象中,因此它们构造函数之间并不存在直接联系,从而无法简单地实现两者相对引用(在 ES6 中可以通过 super...ignition() 方法定义多态性 取决于是在哪个实例中引用它。 在子类不是它们创建实例对象!)中也可以相对引用它继承,这种相对 引用通常被称为 super 。...概念上来说,子类 Bar 应当可以通过相对多态引用(或者说 super )来访问 Foo 中行为。需要注意,子类得到仅仅是继承自行为一份副本。...所以,由于 Car 和 Vehicle 中都有 drive() 函数,为了指明调用对象,必须使用绝对(不是相对)引用。通过名称显式指定 Vehicle 对象并调用它 drive() 函数。

23220

前端面试题 --- JS高阶和其他

对象返回出去 es6和es5继承(继承不用搞那么麻烦,项目中还是用 class) 原型链继承 实例作为子类原型,易于实现,新增实例与属性子类都能访问,创建子类实例,不能向构造函数中传参数...原型链继承 实现: 实例作为子类原型 可以在子类中增加实例属性,如果要新增加原型属性和方法需要在new 构造函数后面 优点: 简单,易实现 新增实例与属性子类都能访问...this修改为子类 this.相当于是把实例属性复制了一份放到子类函数内....优点: 解决了子类构造函数向构造函数中传递参数 可以实现多继承(call或者apply多个) 缺点: 方法都在构造函数中定义,无法复用 不能继承原型属性/方法,只能继承实例属性和方法...3、单例模式 单例模式 保证一个仅有一个实例,并提供一个访问全局访问点 constructor,proto,prototype三角关系。

62410

跟着来,你也可以手写VueRouter

显然,外部并不是这样调用。 所以,router & 细品,VueRouter 组件里怎么获取实例对象(在这个里怎么拿到new VueRouter对象)?...对象,所以最后还为其添加了 _route 属性,暂且将它设置成空对象,后面再完善 「不是实例:」 不是实例,那就是子组件实例了,找实例判断其父实例有没有 _routerRoot 属性,没有就为其加上引用...那新目标信息对象来了,我们首先就要构建一个新路由对象,History 是一个,后面我们还会写子类子类继承子类在初始化实例时候(index.js文件 mode 参数判断那块)其实传入了当前...因为初始化实例子类子类又继承,可以理解为方法以及属性都被子类继承了,transitionTo 方法当然也被继承了,那在调用这个跳转方法时,内部 this 指向就是子类,所以可直接调用子类方法...History 子类也就继承了一切。

1.5K40

Python3 面向对象编程进阶

Softmax 这个是继承自 nn.Module ,Softmax 被称为子类, nn.Module 是子类继承了全部功能(方法)。...,每个 object 地址都不一样, Student 本身则是一个。...', 90) >>> harley.name >>> 'Harleys Zhang' 因此要让内部属性不被外部访问,可以把属性名称前加上两个下划线__,如 Student  score 属性,是无法外部访问实例变量...意思是这个名称是供内部使用,当你看到这样变量,虽然你可以外部访问,但最好不要随意访问。... len() 方法时,我们说,子类 len() 覆盖了 len(),在代码运行时候,总是会调用子类 len(),输出结果13,不是 产生 raise NotImplementedError

39410

基础篇:详解JAVA对象实例化过程

对象实例化是执行方法 一个子类要初始化需要先初始化 2 加载过程 ?...对应着加载->验证->准备->解析-->初始化阶段 加载:载入class对象,不一定是class文件获取,可以是jar包,或者动态生成class 验证:校验class字节流是否符合当前jvm规范 准备...和基本类型,不包含包装类型),它被初始化为一个编译时常量表达式 注意:操作静态字段时,只有直接定义这个字段才会被初始化;如通过其子类来操作中定义静态字段,只会触发初始化不是子类初始化...5 加载器和双亲委派规则,如何打破双亲委派规则 加载器 通过一个全限定名来获取描述此类二进制字节流,实现这个动作代码模块称为加载器 任意一个都需要其加载器和本身来确定在JVM唯一性...java给出解决方法是下层加载器加委托上级加载器去加载,如果无法加载(在自己负责目录找不到对应),交还下层加载器去加载。如下图 ?

1.6K00

万字长文深度剖析面向对象javascript

注意,bind每次调用都会返回一个新函数,从而导致无法取消之前绑定。 继承 构造函数继承 构造函数继承第一步是在子类构造函数中,调用构造函数,让子类实例具有实例属性。...然后让子类原型指向原型,这样子类就可以继承原型。...子类原型指向原型是为了基础原型对象属性。...另外一种写法是Boy.prototype等于一个实例: ~~~js Boy.prototype = new Person(); 上面这种写法也有继承效果,但是子类会具有实例方法。...这是因为子类实例构建,是基于对实例加工,只有super方法才能返回实例。 super作为函数调用时,代表构造函数。ES6 要求,子类构造函数必须执行一次super函数。

31121

JS基础-完美掌握继承知识点

维基百科:继承可以使得子类具有类别的各种属性和方法,不需要再次编写相同代码。 继承是一个另一个获取方法和属性过程。...PS:或者是多个 JS实现继承原理 记住这个概念,你会发现JS继承都是在实现这个目的,差异是它们实现方式不同。 复制属性和方法来重写子类原型对象。...值得一提是:很多博客中说,引用类型属性被所有实例共享,通常会用数组来举例,实际上数组以及其他通过this声明属性也只是通过原型链查找去获取子类实例原型(sonFn.prototype)上值...该对象属性为:子类声明this属性/方法,原型是 PS: 关于call/apply/bind更多细节,推荐查看我博客:js基础-面试官想知道你有多理解call,apply,bind?...组合继承优缺点 优点: 完整继承(又不是不能用),解决了: 通过this声明属性/方法被子类实例共享问题(原型链继承问题) 每次实例子类将重新初始化通过this声明属性,实例根据原型链查找规则

56820

PHP基本概念

抽象不能实例化,普通可以继承抽象。 建议仅在部分 "内核" 代码中使用接口,语义上考虑,可以更多使用抽象。 静态变量 静态变量属于不属于某个实例。...这个变量对所有实例都有效。 ::是作用域限定操作符,这里用是self作用域,不是$this作用域,$this作用域只表示的当前实例,self::表示本身。...与parent和self不同是,parent 引用作用域,self引用是当前作用域,static引用是全部静态作用域,子类会覆盖 栈和堆 一般认为在c中分为这几个存储区:...不可以被实例调用 public protected可以被子类调用,private不可以被子类调用 关于继承 子类中方法访问权限一定不能低于被覆盖方法访问权限,也就是一定要高于或等于方法访问权限...get_called_class 后期静态绑定("Late Static Binding")名称 获取静态方法调用名。

1K20

知识点梳理

,比如说,javascript语言实现继承机制核心就是 ___,不是Java语言那样式继承。...: 子类型有时候需要覆盖类型中某个方法,或者需要添加类型中不存在某个方法。...原型链继承问题: 重写子类原型等于一个实例,那么实例属性变成子类原型属性,如果包含引用类型属性,那么子类所有实例都会共享该属性 。...在创建子类实例时,不能向构造函数传递参数。实际上,应该说是没有办法在不影响所有对象实例情况下,给构造函数传递参数。 2.借用构造函数 借用构造函数解决了原型中包含引用类型值所带来问题。...如果定义变量准备在将来用于保存对象,那么最好将该变量初始化为null不是其他值。

69020

每天10个前端小知识 【Day 9】

继承(inheritance)是面向对象软件技术当中一个概念。如果一个类别B“继承自”另一个类别A,就把这个B称为“A子类”,而把A称为“B类别”也可以称“A是B”。...继承可以使得子类具有类别的各种属性和方法,不需要再次编写相同代码。在子类别继承类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖类别的原有属性和方法,使其获得与类别不同功能。...ECMAscript将原型链作为实现继承主要方法。 ES6提供了Class关键字来实现定义,Class 可以通过extends关键字实现继承,让子类继承属性和方法。...说到js继承,最开始想到应该是是原型链继承,通过把子类实例原型指向实例来继承属性和方法,但原型链继承缺陷在于对子类实例继承引用类型修改会影响到所有的实例对象以及无法向构造方法传参...构造函数继承, 通过在子类构造函数中调用构造函数并传入子类this来获取属性和方法,但构造函数继承也存在缺陷,构造函数继承不能继承到原型链上属性和方法。

7810

JS 原生方法原理探究(四):如何实现继承几种方式?

:用实例作为子类原型,这使得子类实例最终可以访问属性和其原型上方法。...缺点也很明显: 第一:由于构造函数只调用了一次,导致子类原型都统一指向了这次调用所创建实例,所以子类实例在访问一些自身没有的引用类型属性时,实际上访问都是那同一个实例属性。...,核心就是完全不使用原型,而是在子类构造函数中通过 call 调用构造函数,从而增强子类实例 —— 相当于把实例属性都搬到子类实例这里来。...这种继承方法优点就在于,解决了原型链继承缺点,我们现在可以往传参了,而且每次 new 子类时候都会重新调用一次,这使得子类所有实例都有自己属性副本。...组合继承最大问题在于,两次调用了构造函数。

1.4K20

Day12.魔法方法&方法重写

,你可以在子类重写你方法,实例如下: class Parent: #定义父 def myMethod(self): print('调用方法')...子类实例 c.myMethod() #子类调用重写方法 super(Child,c).myMethod() #用子类对象调用已被覆盖方法 #super()是用于调用(超一个方法。...__new__(A) #注意此处采用了参数A不是cls,__new__没有正确返回当前cls实例 b=B() print(b) print(type(b)) #类型所继承...,__ new__ 中参数cls和Bid是相同,表明__ new__ 中默认参数cls就是B本身,而在return时,并没有正确返回当前cls实例,而是返回了其父A实例,因此__ init...__new__(cls) #注意此处采用了参数A不是cls,__new__没有正确返回当前cls实例 b=B() print(b) print(type(b)) #类型所继承

44521

ECMAScript 6教程 (三) Class和Module(和模块)

子类会继承属性和方法。...注意:ColorPoint继承了Point,但是构造函数必须调用super方法。 下面是生成子类实例代码。...classMethod方法前有static关键字,表明该方法是一个静态方法,可以直接在Foo上调用(Foo.classMethod()),不是在Foo实例上调用。...如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。 静态方法,可以被子类继承。...子类继承时,new.target会返回子类。 修饰器 ---- 修饰器(Decorator)是一个表达式,用来修改行为。 修饰器函数可以接受三个参数,依次是目标函数、属性名和该属性描述对象。

42730

js面试知识点笔记

因为浏览器需要通过回流计算最新值 回流必将引起重绘,重绘不一定会引起回流 谈谈你对面向对象理解 JS本身就是面向对象编程 JS本身就是基于面向对象(OOP)编程思想开发出来语言,我们学习JS...:子类重写方法 [继承] 子类继承属性和方法 1....m){ } public void fn(int n,int m,int z){ } 原型继承 // 原型继承:让子类原型指向一个实例 function Parent(){ this.name...,父亲实例本身具备了私有属性和共有方法,子类原型指向,那么子类Son实例就可以找到这些属性和方法了 存在问题 子类可以重写原型上方法,子类还有联系 Son.prototype...不是创建闭包存储 B:可以在最外层形成一个闭包,把一些后续需要公共信息进行存储,不是每一个方法都创建闭包(例如单例模式) C:尽可能手动释放不被占用内存 … 2.尽量合并CSS和JS文件

96420

js面试跳跳题二

如果 valueOf() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。 如果方法 toString() 存在,则调用它。...如果 toString() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。需要注意,原始值到字符串转换。...隐式转换:比如不同类型变量之间比较: console.log({} == 0) CDN 预获取 DNS-prefetch(DNS预获取)能在请求资源之前解析域名 当浏览器(第三方)服务器请求资源时...call() 方法来继承类属性,通改变子类原型,让原型指向实例,就可以共享方法了 这种继承方式优点在于构造函数可以传参,不会与引用属性共享,可以复用函数,但是也存在一个缺点 就是在继承函数时候调用了构造函数...,导致子类原型上多了不需要类属性,存在内存上浪费。

15020
领券