我在JS中调用以下方法:
app.execute({
first: function() {
console.log('executed');
oneMethod(); // function undefined
app.oneMethod(); // works
this.oneMethod(); // works when I exract app object into this variable
},
second: function() {
}
});
app对象如下所示:
var app = function() {
var oneMethod = function() {
};
var secondMethod = function() {
};
var execute = function(first, second) {
var obj = new first();
};
this.oneMethod = oneMethod;
this.secondMethod = secondMethod;
this.execute = execute;
};
因此,第一个代码位于HTML中,第二个代码是外部库。我在execute()
参数中使用外部库的方法做了一些事情。我想这样做,所以我在全局命名空间中没有任何冲突 - 只有app
变量,并且它的方法仅在其参数对象中可用。
因此,当我使用new
关键字创建对象时,我希望在其构造函数中具有相同的命名空间,就像我创建此对象时所做的那样。
这可能吗?还有更好的方法吗?
答案 0 :(得分:1)
听起来你不希望app
成为构造函数,而是一个对象本身。您可以使用显示模块模式(物体回复IIFE)轻松构建它:
var app = (function() {
function oneMethod() {
…
}
function secondMethod() {
…
}
function execute(first, second) {
var obj = new first();
}
return {
oneMethod: oneMethod,
secondMethod: secondMethod,
execute: execute
};
}());
答案 1 :(得分:0)
我们创建一个名称空间app
,将方法绑定到名称空间,以便这些方法不会泄漏到全局。即method
未定义(要求#1),app.method()
“有效”(要求#2)
app = {
execute(First, Second) {},
method(){}
};
我们在First
中创建app.execute()
的实例,希望“在其构造函数中具有相同的命名空间”,以使this.method
构造函数中的First
相同app.method
1}}(要求#3)。 fiddle
app = {
execute(First, Second) {
var object = Object.create(app);
First.call(object);
},
method() {}
};
如果存在app.method
依赖的秘密变量
app = (function () {
var secret = 'variable';
return {
execute(First, Second) { /*...*/ },
method() { return secret }
};
}());
请注意,我们使用了自ES2015以来引入的“a shorter syntax for method definitions on object initializer”。 (Thx,@ Bergi) 我们可以将ES6解决方案转换为ES5,就像那样
app = {
execute: function (First, Second) {
var object = Object.create(app);
First.call(object);
},
method: function () {}
};