例如在承诺中:
New Promise(function(){}).then(function(){});
重要的是哪里? ,语法 <{em> .then
,那么我如何创建一个可以在"."
(点运算符)的其他函数中应用的函数
(伪代码):
function doSomething(a,b) {return a+b}.myOwnFunction(function(){
console.log("Function applied in another function with DOT operator");
});
答案 0 :(得分:2)
在您的示例中,doSomething()
调用的结果必须是myOwnFunction
属性为function
类型的对象。例如,可以通过下一种方法:
function Wrapper(value) {
this.value = value;
}
Wrapper.prototype.myOwnFunction = function() {
console.log("The caller value is " + this.value);
};
然后
function doSomething(a, b) { return new Wrapper(a + b) };
doSomething(1, 2).myOwnFunction(); // The caller value is 3
或
function doSomething(a, b) { return a + b; }
new Wrapper(doSomething(1, 2)).myOwnFunction(); //The caller value is 3
答案 1 :(得分:1)
您所寻找的是“chainable functions”。
示例1
考虑以下示例:
var array = [1, 2, 3];
var index = array.filter(cut).indexOf(3);
console.log(index);
function cut(n){
return n > 1;
}
变量index
返回函数array.filter(...).indexOf(...)
的结果。
但它是如何运作的?让我们分解吧。
<强> 1。初始化数组
var array = [1, 2, 3];
// A variable `array`is created with the value of an array `[1, 2, 3]`.
<强> 2。使用Array
方法filter
array.filter(cut)
// This function returns an array of value [2, 3];
第3。将Array
方法indexOf
链接到filter
array.filter(cut).indexOf(3);
// equals to [2, 3].indexOf(3)
// returns the value 1.
那么为什么我们可以将函数indexOf
链接到filter
?
因为array.filter()
返回一个数组,而indexOf
和filter
是来自Array
构造函数的prototype下的方法。
示例2
类似地,使用String
构造函数的此示例将起作用:
var string = 'This is a string';
var newString = string.substring(0, 4).toUpperCase();
console.log(newString);
因为string.substring(...)
返回一个字符串,而toUpperCase()
是来自String
构造函数的方法。
示例3
这有点棘手。
var string = 'This is a string';
var newString = string.split(' ').indexOf('is');
console.log(newString);
现在,split()
是String
方法,indexOf()
是Array
方法。那么为什么会这样呢?
因为split()
方法返回数组值。因此,您需要一个Array
构造函数的方法来链接它。
如何创建可链接的功能?
您可以使用自己的原型创建自己的构造函数。
var a = undefined;
// The constructor
var Example = function(string){
this.value = string;
}
// The prototypes
Example.prototype.addString = function(string){
this.value += ' ' + string;
return this;
};
Example.prototype.becomeArray = function(){
return this.value.split(' ');
};
// Creating an instance of the constructor
a = new Example('This is a');
console.log(a.constructor === Example);
// Chaining methods from its prototype
a = new Example('This is a').addString('string').becomeArray();
console.log(a);
当然这是一个过于简单的例子。还有很多其他方法可以达到目的。
但那不是这个问题的范围。