如何创建一个不同的函数

时间:2017-11-02 01:30:56

标签: javascript function

例如在承诺中:

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");
});

2 个答案:

答案 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()返回一个数组,而indexOffilter是来自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);

当然这是一个过于简单的例子。还有很多其他方法可以达到目的。

但那不是这个问题的范围。