了解扩展和方法覆盖

Understanding extend and method overwriting

提问人:sisi 提问时间:4/19/2022 更新时间:4/20/2022 访问量:118

问:

这是上一个的后续问题:为什么父原型方法在重写后仍然可执行?

正如我们所看到的,文本对象被函数初始化为第二个导入变量,因此该对象应该是自动自动实例化的对象,并表示扩展的子类。然后在对象内部,它从其父类继承该方法并重写它。首先调用 Parent 方法以触发一些必要的操作,然后为此扩展组件设置数据。{metadata, aaa, init}extendinitinit

我的问题是:这个文字对象中的方法就是它自己的方法,因为引用了文字对象,对吧?如果是,为什么我在调试器工具的专有项下看不到它。在此处输入图像描述initinitthisthis

sap.ui.define([
  "sap/ui/core/UIComponent",
  "sap/ui/model/json/JSONModel",
  "sap/ui/model/resource/ResourceModel",
], function (UIComponent, JSONModel, ResourceModel) {
  "use strict";

  return UIComponent.extend("sap.ui.demo.walkthrough.Component", {
    metadata: {
      "interfaces": [
        "sap.ui.core.IAsyncContentCreation",
      ],
      "rootView": {
        "viewName": "sap.ui.demo.walkthrough.view.App",
        "type": "XML",
        /*"async": true, // implicitly set via the sap.ui.core.IAsyncContentCreation interface*/
        "id": "app",
      },
    },

    aaa: function () {
      console.log("aaa");
    },

    init: function () {
      // call the init function of the parent
      UIComponent.prototype.init.apply(this, arguments);
      // set data model
      var oData = {
        recipient: {
          name: "World",
        },
      };
      var oModel = new JSONModel(oData);
      this.setModel(oModel);
      // set i18n model
      var i18nModel = new ResourceModel({
        bundleName: "sap.ui.demo.walkthrough.i18n.i18n",
      });
      this.setModel(i18nModel, "i18n");
    },

  });
});
javascript sapui5 这个 原型 扩展

评论

0赞 Marc 4/20/2022
我认为你对这个话题想多了。您正在传递给,以便父类 () 中的任何代码都在当前实例(您自己的实例)的上下文中运行。我也不太明白你的截图。 并且是 的一部分,正如预期的那样。问题又是什么?thisinit.applyUIComponentComponentaaainitthis
0赞 sisi 4/20/2022
@Marc,我同意你说的。如果我们的理解是正确的,那么应该有 and 本身,而不是它的 ,这就是屏幕截图上显示的内容。在屏幕截图中,它看起来像 并且属于 ,而不是 。这就是我不明白的。thisaaainit[[prototype]]aaainitUIComponentComponent

答:

1赞 Marc 4/20/2022 #1

希望这个另一个答案能澄清一些事情:

__proto__是在查找链中用于解析方法等的实际对象。 是当您使用prototype__proto__new

这意味着,当您在 prototype 部分中看到方法时,并不意味着原始父类被覆盖。你的新“类”也有一个原型,并且(这是你的新“类”的一个实例)有自己的。这个新的原型/原型污染方法构成了父原型,还可以定义新方法。sap.ui.demo.walkthrough.Componentthis__proto__

sap.ui.base.Object.extend 的文档中:

创建名为 sClassName 的 sap.ui.base.Object 类的子类,并使用 oClassInfo 中包含的信息扩充该子类。

oClassInfo 可能包含三种类型的信息:

  • [...]
  • any-other-name:将 oClassInfo 中的任何其他属性复制到新创建的类的原型对象中。因此,调用者可以将方法或属性添加到类的所有实例中。

因此,当您执行此操作时,您将看到当前实例的构建计划。 do 从父类获取生成计划。do 获取祖父类(依此类推)。this.__protothis.__proto__.__proto__this.__proto__.__proto__.__proto__

父类的原型不受子类的影响。但是您的子类包括父类中的所有内容。当你“覆盖”一个方法时,你正在向你的新原型添加一个方法。父方法仍然存在于原型中,因此可以通过显式声明来调用。UIComponentUIComponent.prototype.init.apply