gpt4 book ai didi

JavaScript:向原型(prototype)方法添加命名空间

转载 作者:行者123 更新时间:2023-12-03 12:30:23 33 4
gpt4 key购买 nike

我有一个商业应用程序,它具有使用原型(prototype)链的现有 JavaScript 对象结构。我通过向对象原型(prototype)添加更多方法,成功地扩展了此 API。但是,我意识到最好在我的方法前面添加一个命名空间,以防应用程序 vendor 决定在未来版本中命名与我的方法之一相同的新方法。

如果我有一个名为 State 的现有对象,我会添加一个名为 getPop 的方法,如下所示:

State.prototype.getPop = function(){return this.pop;};

var Washington = new State('Washington',7000000);

Washington.getPop(); //returns 7000000

我想要做的是在我的自定义方法之前添加一个名为“cjl”的命名空间以避免名称冲突,以便我可以像这样调用它:

Washington.cjl.getPop();

我尝试过:

State.prototype.cjl = {};
State.prototype.cjl.getPop = function(){return this.pop;};

问题是这个。它不指向实例,而是指向“cjl”对象。

我尝试了各种方法,包括使用 .bind() 但似乎都不起作用。我终于在这里找到了答案:Is it possible to organise methods on an object's prototype into namespaces?这可以使用 Object.defineProperty() 方法来实现。问题是商业应用程序只能在 IE 中以兼容模式运行,IE 不支持非 DOM 元素的 Object.defineProperty() 方法。

还有其他方法可以实现这一点吗?我不想调用多个函数,这是某些技术的结果,例如:

Washington.cjl().getPop();

最佳答案

您可以通过以下方式命名空间,阅读您的评论,我发现您无法更改原始构造函数,因此您必须用自己的构造函数替换原始构造函数,并将原始构造函数保存在闭包中。

每个状态实例都有自己的 cjl 实例,但仅引用当前 State 实例,所有 cjl 函数都是共享的,因为它们只存在一次:

[更新]忘记在 myState 的原型(prototype)链中获取 State.prototype。

//the original constructor
function State(name, pop){
this.name=name;this.pop=pop;
}
State.org="original constructor";

//original constructor is available through
// closure and window.State is replaced with
// your constructor having the cjl namespace
(function(State){
//cjl namespace
function cjl(stateInstance){
this.stateInstance=stateInstance;
};
//cjl functions
cjl.prototype.getPopInThousands=function(){
//do not use this, instead use this.stateInstance
return this.stateInstance.pop/1000;
}
function myState(){
//apply State constructor
State.apply(this,arguments);
//create a clj instance, all methods
// are on cjl.prototype so they're shared
this.cjl = new cjl(this);
}
//inherit from State (use polyfil for older browsers)
myState.prototype = Object.create(State.prototype);
//replace window.State with your constructor
window.State=myState;
}(State))

var s = new State("Wasington", 7000000);
console.log(s.cjl.getPopInThousands());
//non standard, name
console.log("constructor name",s.constructor.name);
console.log("constructor tostring",s.constructor.toString());

有关构造函数和原型(prototype)的更多信息可以在这里找到:https://stackoverflow.com/a/16063711/1641941

我必须同意 friend 和 cookie 的观点,即预先修复函数名称可能是更好的解决方案,但如果您想对名为 Country 的对象使用相同的方法,那么您可能会考虑使用以前的代码,因为您可以重复使用cjl 对象。

关于JavaScript:向原型(prototype)方法添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23962405/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com