例如:

class Parent {

  foo() {
    console.log("foo");
  }
}

class Child extends Parent {

  bar() {
    console.log("bar");
  }
}

这里,表达式

Object.getPrototypeOf(Child) === Parent

将判断为true.

现在我了解了原型继承的基本知识以及类在Javascript中的工作方式,也就是说,每个函数都有一个prototype属性,在使用new操作符调用该函数时,该属性会复制到新创建的类实例的__proto__属性中

我还理解,Object.getPrototypeOf基本上返回任何给定对象的__proto__属性,通常我们通过将子类的prototype属性设置为父类的实例来模拟纯javascript中的继承,如下所示:

function Parent(){}
 
Parent.prototype.foo = function(){
  console.log("foo");
}
 
function Child(){}
 
// Inherit properties from Parent
Child.prototype = new Parent();

我的问题是:

  • 用类作为参数调用Object.getPrototypeOf的结果代表什么?它是如何与TS/JS中的类继承联系在一起的?

  • 使用Object.getPrototypeOf判断特定类是否在运行时扩展了另一个类是否安全?

推荐答案

extends关键字有两个作用:

  • 它设置超类.prototype对象作为子类的原型.原型对象.在您的例子中,Child.prototype获取Parent.prototype个对象作为其原型.

  • 它还将超类的构造函数设置为子类构造函数的原型.在您的例子中,Child个构造函数得到Parent个构造函数作为其原型.

上述两种说法在代码中基本上是指以下内容:

class Parent {}
class Child extends Parent {}

console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype);
console.log(Object.getPrototypeOf(Child) === Parent);

换句话说,extends关键字建立了两个原型链:

Child.prototype ---> Parent.prototype ---> Object.prototype

Child ---> Parent ---> Function.prototype ---> Object.prototype

因此,Object.getPrototypeOf(Child)只返回Parent构造函数.

Javascript相关问答推荐

将本机导航路由react 到导航栏中未列出的屏幕?

如何将Cookie从服务器发送到用户浏览器

Angular 订阅部分相互依赖并返回数组多个异步Http调用

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

在FAQ Accodion应用程序中使用React useState时出现问题

为什么我的按钮没有从&q;1更改为&q;X&q;?

为什么云存储中的文件不能公开使用?

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

匹配一个或多个可选重复的特定模式

JWT Cookie安全性

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

如何使用fltter_js将对象作为参数传递给javascrip?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

使用Java脚本在div中创建新的span标记

是否在图表中计算线上的点坐标?

使用Video.play()时,视频显示白屏

对两个不同值的数组进行排序,并保持平面数组 struct

Set scale jquery

按下按钮时更改图标