提问人:sisi 提问时间:4/19/2022 更新时间:4/20/2022 访问量:118
了解扩展和方法覆盖
Understanding extend and method overwriting
问:
这是上一个的后续问题:为什么父原型方法在重写后仍然可执行?
正如我们所看到的,文本对象被函数初始化为第二个导入变量,因此该对象应该是自动自动实例化的对象,并表示扩展的子类。然后在对象内部,它从其父类继承该方法并重写它。首先调用 Parent 方法以触发一些必要的操作,然后为此扩展组件设置数据。{metadata, aaa, init}
extend
init
init
我的问题是:这个文字对象中的方法就是它自己的方法,因为引用了文字对象,对吧?如果是,为什么我在调试器工具的专有项下看不到它。在此处输入图像描述init
init
this
this
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");
},
});
});
答:
希望这个另一个答案能澄清一些事情:
__proto__
是在查找链中用于解析方法等的实际对象。 是当您使用prototype
__proto__
new
这意味着,当您在 prototype 部分中看到方法时,并不意味着原始父类被覆盖。你的新“类”也有一个原型,并且(这是你的新“类”的一个实例)有自己的。这个新的原型/原型污染方法构成了父原型,还可以定义新方法。sap.ui.demo.walkthrough.Component
this
__proto__
从 sap.ui.base.Object.extend 的文档中:
创建名为 sClassName 的 sap.ui.base.Object 类的子类,并使用 oClassInfo 中包含的信息扩充该子类。
oClassInfo 可能包含三种类型的信息:
- [...]
- any-other-name:将 oClassInfo 中的任何其他属性复制到新创建的类的原型对象中。因此,调用者可以将方法或属性添加到类的所有实例中。
因此,当您执行此操作时,您将看到当前实例的构建计划。
do 从父类获取生成计划。do 获取祖父类(依此类推)。this.__proto
this.__proto__.__proto__
this.__proto__.__proto__.__proto__
父类的原型不受子类的影响。但是您的子类包括父类中的所有内容。当你“覆盖”一个方法时,你正在向你的新原型添加一个方法。父方法仍然存在于原型中,因此可以通过显式声明来调用。UIComponent
UIComponent.prototype.init.apply
评论
this
init.apply
UIComponent
Component
aaa
init
this
this
aaa
init
[[prototype]]
aaa
init
UIComponent
Component