当前位置: 首页 > 面试题库 >

关于设置something.prototype .__ proto__的困惑

益麻雀
2023-03-14
问题内容

在Node.js Express模块​​的代码中,我碰到了这一行,为服务器设置继承:

Server.prototype.__proto__ = connect.HTTPServer.prototype;

我不确定这样做是什么-
MDC文档(https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_Revisited#prototype_and_
proto )似乎说我可以这样做:

Server.prototype = connect.HTTPServer.prototype;

确实,我做了这个测试:

var parent = function(){}
parent.prototype = {
    test: function(){console.log('test')};
}

var child1 = function(){};
child1.prototype = parent.prototype;
var instance1 = new child1();
instance1.test();     // 'test'

var child2 = function(){};
child2.prototype.__proto__ = parent.prototype;
var instance2 = new child2();
instance2.test();     // 'test'

看起来一样吗?所以,是的,我想知道object.prototype .__ proto是什么设置的。谢谢!


问题答案:

看看图上这个网页(mckoss.com),显示prototypeconstructor__proto__一个小的层次结构关系。图下的代码也很好地描述了这种关系。

当您具有一个function Base并设置了所定义的功能对象的原型时,该语句会自动将of Derived.prototype = new Base;设置为__proto__(实际上是internal
[[prototype]]),从而使Derived成为可以实例化对象的类。这似乎是定义派生类的一种更加符合标准的方法。Derived.prototype``Base.prototype

据我了解,这__proto__是访问[[prototype]]对象内部的一种非标准方式。它似乎得到了很好的支持,但是我不确定是否应该信任它。

无论如何,您的示例Server.prototype.__proto__ = connect.HTTPServer.prototype;似乎都是通过另一种方式进行推导的:首先Server通过定义构造函数和原型定义一个对象,然后[[prototype]]手动将内部连接起来以将其变形为从派生的类HTTPServer

至于建议的替代方法,Server.prototype = connect.HTTPServer.prototype;:那是个坏主意。在这里,您将的原型设置Server为与的原型相同的对象HTTPServer。因此,您对Server类所做的任何更改都将直接反映在中HTTPServer,并且可以从的其他派生类访问HTTPServer。如果从两个派生的类HTTPServer试图定义同一成员,则可以对混乱进行想象。



 类似资料:
  • 当您可以调用递归方法而不是必须将递归方法设置为变量时,是否有一种简单的方法来理解? 例如... 只是调用递归函数遍历: self.recurse(node.left) self.recurse(node.right) 必须将递归函数设置为node。左和右。右: 节点。左=自我。递归(node.left) 节点。右=自我。递归(node.left) 另一个例子是删除bst中的一个节点,你必须将递归函

  • 1.首先,我想确认一下从编程的角度,我们有“静态类型检查”和“动态类型检查,对把? 2.一般情况下我们用typescript做静态类型检查,检查源码里面自定义数据类型,对把? 3.那么,我们做的所谓的动态类型检查是不是指的那些库,比如Joi,ajv什么的,比如你点击一个按钮,然后调这个库来检查一个obj的schema,如果类面的key value类型都能对的上,我们就通过,如果类型对不上,我们就报

  • 例如,一个方法中有10000次循环。当它运行1000次时,backedge\u计数器触发JIT编译。解释器继续执行。当它循环4000次时,JIT编译完成。 我的问题是,剩余的6000次是如何由解释器执行的,还是如何执行本机代码?或者在下次调用此方法之前不会执行本机代码?下次调用此方法时会发生什么?

  • 但后者给了我下面的例外。这是为什么? java.lang.StringIndexOutOfBoundsException:String index超出范围:1 java.lang.StringIndexOutOfBoundsException:String index超出范围:1 java.lang.String.charat(String.java:658)在Scala.Collection.i

  • 我无法理解这句话(特别是粗体部分): 类型“指向 cv1 void 的指针”的 prvalue 可以转换为类型为“指向 cv2 T”的 prvalue,其中 T 是对象类型,cv2 是与 cv1 相同的 cv 限定或大于 cv1 的 cv 限定。如果原始指针值表示内存中某个字节的地址 A,并且 A 不满足 T 的对齐要求,则生成的指针值未指定。 我的问题是: > (的地址)指向的地址是否满足 的对

  • 我需要的是,我将在端口(本地机器)中打开一个服务器监听,并且可以向我发送数据包。我的计算机没有。基本上我需要。 我正在测试服务器/客户端项目。我在服务器(公共ip)中运行stuntman-server。在我的系统中运行客户端(本地ip)。我要求为端口提供映射IP/端口。 Stun服务器返回IP和端口。然后,我在本地系统中打开一个服务器(使用java),并开始侦听端口,并将一个消息从发送到stun服