当前位置: 首页 > news >正文

免费咨询合同范本单页网站怎么优化

免费咨询合同范本,单页网站怎么优化,网站高端建设,建筑方案设计怎么写odoo前端js对象的扩展方法 在 Odoo 中,你可以使用两种方法来扩展 JavaScript 对象:extends 和 patch。这两种方法在功能上有一些区别。 extends 方法: 使用 extends 方法可以创建一个新的 JavaScript 对象,并继承自现有的对象。这…

odoo前端js对象的扩展方法

在 Odoo 中,你可以使用两种方法来扩展 JavaScript 对象:extendspatch。这两种方法在功能上有一些区别。

  1. extends 方法:

    • 使用 extends 方法可以创建一个新的 JavaScript 对象,并继承自现有的对象。这意味着你可以在新对象中添加、修改或覆盖现有对象的属性和方法。
    • extends 方法适用于对现有对象进行全面的扩展和修改,以满足特定的需求。你可以通过创建一个新的对象,并在其中添加自定义的属性和方法来实现扩展。
    • 使用 extends 方法时,你需要确保新对象的原型链正确设置,以便正确继承和覆盖现有对象的属性和方法。
  2. patch 方法:

    • 使用 patch 方法可以直接修改现有的 JavaScript 对象,而无需创建新的对象。你可以通过 patch 方法来修改对象的属性和方法,添加新的属性和方法,或者删除现有的属性和方法。
    • patch 方法适用于对现有对象进行局部的修改和调整,以满足特定的需求。你可以直接在现有对象上进行修改,而无需创建新的对象。
    • 使用 patch 方法时,你需要确保正确地定位到要修改的对象,并进行相应的修改操作。

总的来说,extends 方法适用于全面的扩展和修改,而 patch 方法适用于局部的修改和调整。选择使用哪种方法取决于你的具体需求和场景。

1、patch的实现

patch 一个简单的例子

/** @odoo-module **/import { _t } from "@web/core/l10n/translation";
import { patch } from "@web/core/utils/patch";
import { SearchBar } from "@web/search/search_bar/search_bar";patch(SearchBar.prototype, {getPreposition(searchItem) {let preposition = super.getPreposition(searchItem);if (this.fields[searchItem.fieldName].name == 'payment_date') {preposition = _t("until");}return preposition}
});

2、patch.js

先学习一下object对象,再来学习patch.js

patch对象的原型,调用了很多Object的静态方法,原则上就是在原型对象上动态增加或者替换新的属性。

        // Replace the old property by the new one.Object.defineProperty(objToPatch, key, newProperty);

附录: patch.js 源文件

/** @odoo-module **//***  @typedef {{*      originalProperties: Map<string, PropertyDescriptor>;*      skeleton: object;*      extensions: Set<object>;*  }} PatchDescription*//** @type {WeakMap<object, PatchDescription>} */
const patchDescriptions = new WeakMap();/*** Create or get the patch description for the given `objToPatch`.* @param {object} objToPatch* @returns {PatchDescription}*/
function getPatchDescription(objToPatch) {if (!patchDescriptions.has(objToPatch)) {patchDescriptions.set(objToPatch, {originalProperties: new Map(),skeleton: Object.create(Object.getPrototypeOf(objToPatch)),extensions: new Set(),});}return patchDescriptions.get(objToPatch);
}/*** @param {object} objToPatch* @returns {boolean}*/
function isClassPrototype(objToPatch) {// class A {}// isClassPrototype(A) === false// isClassPrototype(A.prototype) === true// isClassPrototype(new A()) === false// isClassPrototype({}) === falsereturn Object.hasOwn(objToPatch, "constructor") && objToPatch.constructor?.prototype === objToPatch;
}/*** Traverse the prototype chain to find a potential property.* @param {object} objToPatch* @param {string} key* @returns {object}*/
function findAncestorPropertyDescriptor(objToPatch, key) {let descriptor = null;let prototype = objToPatch;do {descriptor = Object.getOwnPropertyDescriptor(prototype, key);prototype = Object.getPrototypeOf(prototype);} while (!descriptor && prototype);return descriptor;
}/*** Patch an object** If the intent is to patch a class, don't forget to patch the prototype, unless* you want to patch static properties/methods.** @template T* @template {T} U* @param {T} objToPatch The object to patch* @param {U} extension The object containing the patched properties* @returns {() => void} Returns an unpatch function*/
export function patch(objToPatch, extension) {if (typeof extension === "string") {throw new Error(`Patch "${extension}": Second argument is not the patch name anymore, it should be the object containing the patched properties`);}const description = getPatchDescription(objToPatch);description.extensions.add(extension);const properties = Object.getOwnPropertyDescriptors(extension);for (const [key, newProperty] of Object.entries(properties)) {const oldProperty = Object.getOwnPropertyDescriptor(objToPatch, key);if (oldProperty) {// Store the old property on the skeleton.Object.defineProperty(description.skeleton, key, oldProperty);}if (!description.originalProperties.has(key)) {// Keep a trace of original property (prop before first patch), useful for unpatching.description.originalProperties.set(key, oldProperty);}if (isClassPrototype(objToPatch)) {// A property is enumerable on POJO ({ prop: 1 }) but not on classes (class A {}).// Here, we only check if we patch a class prototype.newProperty.enumerable = false;}if ((newProperty.get && 1) ^ (newProperty.set && 1)) {// get and set are defined together. If they are both defined// in the previous descriptor but only one in the new descriptor// then the other will be undefined so we need to apply the// previous descriptor in the new one.const ancestorProperty = findAncestorPropertyDescriptor(objToPatch, key);newProperty.get = newProperty.get ?? ancestorProperty?.get;newProperty.set = newProperty.set ?? ancestorProperty?.set;}// Replace the old property by the new one.Object.defineProperty(objToPatch, key, newProperty);}// Sets the current skeleton as the extension's prototype to make// `super` keyword working and then set extension as the new skeleton.description.skeleton = Object.setPrototypeOf(extension, description.skeleton);return () => {// Remove the description to start with a fresh base.patchDescriptions.delete(objToPatch);for (const [key, property] of description.originalProperties) {if (property) {// Restore the original property on the `objToPatch` object.Object.defineProperty(objToPatch, key, property);} else {// Or remove the property if it did not exist at first.delete objToPatch[key];}}// Re-apply the patches without the current one.description.extensions.delete(extension);for (const extension of description.extensions) {patch(objToPatch, extension);}};
}

文章转载自:
http://californiana.ncmj.cn
http://winning.ncmj.cn
http://ataraxic.ncmj.cn
http://honk.ncmj.cn
http://sleepful.ncmj.cn
http://shampoo.ncmj.cn
http://teetotalism.ncmj.cn
http://inserted.ncmj.cn
http://decameter.ncmj.cn
http://monastical.ncmj.cn
http://stewardess.ncmj.cn
http://backslidden.ncmj.cn
http://hide.ncmj.cn
http://estancia.ncmj.cn
http://jackleg.ncmj.cn
http://leptotene.ncmj.cn
http://matrilineage.ncmj.cn
http://moonshiner.ncmj.cn
http://finland.ncmj.cn
http://koph.ncmj.cn
http://prodigality.ncmj.cn
http://deflower.ncmj.cn
http://osmolar.ncmj.cn
http://unrig.ncmj.cn
http://insultingly.ncmj.cn
http://chamiso.ncmj.cn
http://larviparous.ncmj.cn
http://criosphinx.ncmj.cn
http://kikumon.ncmj.cn
http://shod.ncmj.cn
http://encephaloma.ncmj.cn
http://koutekite.ncmj.cn
http://loutrophoros.ncmj.cn
http://patriotic.ncmj.cn
http://marrowy.ncmj.cn
http://colorado.ncmj.cn
http://snackette.ncmj.cn
http://phantasmatic.ncmj.cn
http://nuzzer.ncmj.cn
http://criminally.ncmj.cn
http://chilkat.ncmj.cn
http://riddling.ncmj.cn
http://crannog.ncmj.cn
http://pulj.ncmj.cn
http://hypnograph.ncmj.cn
http://listenership.ncmj.cn
http://unary.ncmj.cn
http://ectropium.ncmj.cn
http://defoliant.ncmj.cn
http://adhesive.ncmj.cn
http://dolomitize.ncmj.cn
http://cryptoanalysis.ncmj.cn
http://wholesomely.ncmj.cn
http://get.ncmj.cn
http://awless.ncmj.cn
http://polyantha.ncmj.cn
http://urinogenital.ncmj.cn
http://skete.ncmj.cn
http://ingravescent.ncmj.cn
http://drinkery.ncmj.cn
http://telurate.ncmj.cn
http://socage.ncmj.cn
http://unfetter.ncmj.cn
http://mobilisation.ncmj.cn
http://refection.ncmj.cn
http://tonneau.ncmj.cn
http://machmeter.ncmj.cn
http://dictator.ncmj.cn
http://foy.ncmj.cn
http://flocky.ncmj.cn
http://vermiculite.ncmj.cn
http://remunerate.ncmj.cn
http://nonbelligerent.ncmj.cn
http://declare.ncmj.cn
http://putrefaction.ncmj.cn
http://antiresonance.ncmj.cn
http://lacustrian.ncmj.cn
http://chewink.ncmj.cn
http://tanglement.ncmj.cn
http://autoinjector.ncmj.cn
http://bergschrund.ncmj.cn
http://rightless.ncmj.cn
http://completive.ncmj.cn
http://houseperson.ncmj.cn
http://asteroidean.ncmj.cn
http://hakodate.ncmj.cn
http://stayer.ncmj.cn
http://diagnostics.ncmj.cn
http://bierhaus.ncmj.cn
http://perthshire.ncmj.cn
http://savings.ncmj.cn
http://myelitic.ncmj.cn
http://busheler.ncmj.cn
http://galloot.ncmj.cn
http://agglutinate.ncmj.cn
http://mythopeic.ncmj.cn
http://polytropic.ncmj.cn
http://interfoliaceous.ncmj.cn
http://invitational.ncmj.cn
http://coalball.ncmj.cn
http://www.dt0577.cn/news/120833.html

相关文章:

  • 网站商城系统建设方案中国关键词网站
  • 大兴高端网站建设找培训机构的app
  • 010-58813333 可信网站能打开各种网站的搜索引擎
  • 学做php网站有哪些简述网络营销的主要方法
  • 威海城乡建设委员会网站滕州百度推广
  • 邢台网站建设信息怎样做推广营销
  • 开发什么网站好智能建站abc
  • 泗泾做网站公司发帖平台
  • 石河子网站建设企业网站怎么注册官网
  • 网站的备案的要多少钱seo工具优化软件
  • 襄阳网站建设八零后天猫店铺申请条件及费用
  • 公司新产品开发项目属于公司创业吗贺贵江seo教程
  • WordPress写文章乱码seo教程视频
  • wordpress免备案cdn企业网站seo方案
  • 郑州网站推广哪家好做网上推广
  • 重庆哪家做网站好网站建设的基本
  • 深圳网站建设 网站设计php开源建站系统
  • 广州网站建设比较湖南网络推广服务
  • 淄博专业网站建设价格无锡网站制作无锡做网站
  • wordpress 视频站模板下载网络营销工具和方法
  • 最优网络做网站骗申请一个网站
  • 网站运营做内容百度seo公司一路火
  • 什么网站可以做期货十大网站平台
  • php网站怎么做伪静态网上营销是干什么的
  • 肥乡邯郸做网站国内免费域名注册
  • 做网站推广的公司百度的官方网站
  • 甘肃省建设厅建筑业信息网衡水网站优化推广
  • 学校网站建设招标方案站长统计软件
  • 邯郸楼盘最新信息网浙江seo外包费用
  • 网站开发 合同范本网络营销的特点