【问题标题】:Why is the result not what I expect?为什么结果不是我所期望的?
【发布时间】:2020-08-07 04:35:19
【问题描述】:

我正在将此代码 sn-p 复制到 Chrome 的控制台中。

function F() {};
F.prototype.fMethod = function WOT() {console.log(this)};

function G() {};

Object.setPrototypeOf(G.prototype, {...F.prototype.fMethod, ...Object.prototype})

console.log(Object.getPrototypeOf(G.prototype));

我期望Object.getPrototypeOf(G.prototype) 返回的是

{
function WOT, //the content/properties of the object `F.prototype.fMethod` points to.
constructor: ... //the content/properties of the object Object.prototype points to. 
hasOwnProperty: ...
isPrototypeOf: ... 
}

您可以在此处查看我在 Chrome 控制台上获得的信息:

【问题讨论】:

  • 你是在尝试做Function.prototype.method = function() {console.log(this)}吗?你为什么要以一种令人费解的方式来做这件事?
  • @slebetman 我正在尝试 i)首先确认单继承的含义(我读到 JavaScript 就是这样做的)和 ii)如果我对单继承的理解是正确的,我试图通过使 Function.prototype.__proto__ 指向包含 2 个 Constructor.prototypes - 1 来自 Object 和另一个来自 F 的对象来“破坏”它
  • @tonitone120 我刚刚看到这个问题 - 我不确定你最初问的是什么,但在修订版中,你似乎误解了对象扩展符号的作用。您看到一个空对象作为输出的原因是您正在传播的两个对象(一个没有添加特殊属性的函数对象和Object.prototype)都没有可枚举的属性。
  • 这只是因为扩展语法(...)只为您提供了可枚举的属性。这不是我非常了解的领域,我不能给你任何明确的参考,但我的理解是 ...obj 迭代 obj 以(在这种情况下)将其键和值添加到对象正在定义 - 但迭代对象的默认行为是忽略不可枚举的属性。

标签: javascript


【解决方案1】:

除了不清楚您想要实现的目标之外,我们可能最接近您想要实现的目标可能是:

function F() {};
F.prototype.fMethod = function WOT() { console.log(this) };

function G() {};

console.log(Object.prototype);

Object.setPrototypeOf(G, { ...F.prototype,
  // since Object.prototype is an empty object, next line is irrelevant
  ...Object.prototype
});

console.log(Object.getPrototypeOf(G));

曾经说过,我强烈建议你澄清你的目标,以便我们可以帮助你找到更好的方法来实现它。

【讨论】:

  • 不一定要有所成就只是想知道为什么我得到的结果与我预期的结果不同
  • 很难说为什么一个明显空的对象与你所期望的不同,而不知道你所期望的@tonitone120。我可以说您的结果显然是一个空对象,因为您正在合并两个空对象:...F.prototype.fMethod(作为对象访问的函数结果为空对象)和...Object.prototype 这是一个空对象
  • 我认为你已经达到了目标。什么(我认为)我现在才学习的是没有可枚举属性的对象(除了__proto__?)看起来是空的。例如,对我的代码稍作更改(添加F.prototype.fMethod.color = "red")就会显示这个color 属性。这是因为Object.setPrototypeOf 的第二个参数只接受“自己的”属性吗?
  • 否 @tonitone120 ,它按原样获取对象,您的代码中删除不可枚举属性的是对象解构:...Object.prototype
【解决方案2】:

上线

Object.setPrototypeOf(G.prototype, {...F.prototype.fMethod, ...Object.prototype})

您将G.prototype 的原型设置为空对象,因为

// You are unpacking two objects
{
  ...F.prototype.fMethod, // is your WOT function which has no owned properties to unpack
  ...Object.prototype // which is an empty object
}

【讨论】:

  • 谢谢@AlessandroChiitolina。那么我从中得到的是 Object.setPrototypeOf() 的第二个参数仅“计数”自己的属性?
  • 不,setPrototypeOf 的第二个参数接受传递的整个对象。问题是您正在使用扩展运算符将一个函数(没有可枚举的属性)解包到一个新对象中。写在您问题上的第二个论点与{} 相同。如果希望 G 继承 F(使用 fMethod),则可能必须使用 Object.setPrototypeOf(G.prototype, F.prototype) 或将其声明为 class G extends F {}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2013-05-26
相关资源
最近更新 更多