以下是我想要实现的示例代码
function myObj(){
this.method1 = function() {
console.log('method 1 is called');
}
// if method1 is not called ...
this.default = function() {
console.log('default method is called');
}
return this;
}
myObj(); // call default
myObj().method1(); // call method1
在此代码中,我希望能够检测是否正在使用myObj()
返回对象(具有method1
方法)。
如果是这种情况(如果我们将myObj()
链接到其他东西)则执行最后一个链接方法。如果没有,则在myObj()
;
我采用的一种方法是从myObj()
返回一个函数,其行为如下:
myObj()();
myObj().method1()();
我也可以将方法传递给基函数并将其链接到对象中:
myObj();
myObj(method1);
但也许有另一种方法可以做这样的事情,你有什么想法吗? 谢谢,
答案 0 :(得分:2)
如果没有像您调用结果的示例那样执行此操作,则无法在myObj
内检测到它,如下所示:
function myObj(){
var rv = function() {
snippet.log("default method called");
};
rv.method1 = function() {
snippet.log('method 1 is called');
};
return rv;
}
myObj()(); // call default, note the extra ()
myObj().method1(); // call method1 [*no* extra ()]
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
在评论中我说要求额外的()
要求麻烦,因为它很容易忘记,但当然,如果myObj
本身除了返回函数之外什么都不做,然后,如果您忘记()
,您将看不到默认功能,并且可能会发现您忘记了()
。
在别处的评论中,你说你可能想做链接。你可以用上面的方法做到这一点,只需在函数的末尾添加“return rv”:
function myObj(){
var rv = function() {
snippet.log("default method called");
return rv;
};
rv.method1 = function() {
snippet.log('method 1 is called');
return rv;
};
return rv;
}
myObj()(); // call default, note the extra ()
myObj().method1(); // call method1 [*no* extra ()]
myObj()().method1()(); // call default, then method1, then default
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
我确信你已经排除了这一点,但仅仅是为了完整性:通常的做法是将“默认”显式化,例如:
function myObj(){
return {
_: function() {
snippet.log("default method called");
},
method1: function() {
snippet.log('method 1 is called');
}
};
}
myObj()._(); // call default
myObj().method1(); // call method1
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
当然,您可以使用原型链和所有其他标准对象的优点。
答案 1 :(得分:1)
检测函数的返回值是否具有稍后调用的方法不是您可以合理地执行的操作。但是,您将第二个函数传递给第一个函数的计划是一个经过验证的模式。你可以这样做:
function myObj(callback) {
function defaultFunc() {/* code */}
//other code, properties, etc
//check if the user wants to chain functions
if(callback) {
callback();
}
//call the default function if there is nothing else to execute
else {
defaultFunc();
}
}
用法:
myObj(method1); // Where method1 is a function defined somewhere
如果你不想将整个函数传递给你的对象但只想执行myObj的一个属性,你也可以传递函数的名称。
function myObj(methodName) {
this.defaultFunc = function() {/* code */}
this.myMethod = function() {/* code */}
//other code, properties, etc
//check if the user wants to chain functions
if(methodName && this[methodName]) {
this[methodName]();
}
//call the default function if there is nothing else to execute
else {
this.defaultFunc();
}
}
用法:
new myObj("method1"); // Note it's a string
答案 2 :(得分:1)
我认为这会有所帮助:
var myObj = function(callDefault){
if(callDefault){
// DEFAULT METHOD GOES HERE
console.log('default method is called')
// DO SOMETHING
}
return {
method1: function(){
console.log('method 1 is called');
// DO SOMETHING
},
method2: function(){
console.log('method 2 is called');
// DO SOMETHING
}
}
}
myObj(true)
//调用默认函数并返回其他函数列表
myObj().method1()
//仅调用方法1
myObj().method2()
//仅调用方法2
myObj(true).method1()
//默认调用方法1
myObj(true).method2()
//默认调用方法2
答案 3 :(得分:0)
仅举例来说,这不是办法:
function myObj(){
var isCalled = false;
this.method1 = function() {
isCalled = true;
console.log('method 1 is called');
}
this.default = function() {
if(isCalled) return;
console.log('default method is called');
}
setTimeout(this.default, 1000); // default time
return this;
}
myObj(); // after 1 s default is called
myObj().method1(); // method1 is called right away and default is never called
答案 4 :(得分:0)
如果我理解正确,你需要一个构造函数,它接受一个参数作为输入,并创建一个附加了方法的对象。如果输入参数是有效的回调函数,则调用它,否则调用默认函数。
function myObj(callback) {
this.method = function() {
if(typeof callback == 'function'){
callback();
console.log('call-back is called');
} else {
// default function
console.log('default method is called');
}
}
}
用法:
(new myObj()).method(); // call default
(new myObj(somefunction)).method(); // call 'somefunction'