Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript新手,尝试理解返回函数的函数_Javascript - Fatal编程技术网

javascript新手,尝试理解返回函数的函数

javascript新手,尝试理解返回函数的函数,javascript,Javascript,我试图了解这里发生了什么: if (!Object.create) { Object.create = (function () { var F = function(){}; return function (o) { if (arguments.length !== 1) { throw new Error('Object.create implementation only accepts one parameter.');

我试图了解这里发生了什么:

if (!Object.create) {
Object.create = (function () {
    var F = function(){};

    return function (o) {
        if (arguments.length !== 1) {
            throw new Error('Object.create implementation only accepts one parameter.');
        }
        F.prototype = o;
        return new F();
    };
}());
}

F.prototype是什么意思。。。返回函数是如何工作的

function dostuff() {
  return function () {console.log('hello')}
}

f = dostuff();
f();

--output:--
hello


Initialy F是空函数,new F()返回空对象,即{}

之后

F.prototype = o
F as类获取对象o的属性

例如,如果o={a:1},则new F()返回{a:1}

这与将F定义为相同

F = function(){
  this.a = 1;
}

但在您的示例中,您可以根据传递给create()函数的object o类创建新对象,这是两个独立的问题。原型的概念及其含义与返回函数的概念是分开的。我会尽力解释

F.prototype是什么意思?

Javascript不支持传统意义上的继承,而是使用原型继承将对象属性从一个函数传递到另一个函数

默认情况下,所有Javascript对象都包含一个prototype字段。prototype字段最初总是设置为基本对象。(您可以通过执行以下操作创建对象的新实例:
var x=new Object()
或通过执行
var x={}
)可以创建将原型设置为另一个对象的对象,从而访问放置在原型上的方法和属性

让我们通过一个例子来说明

假设您创建了一个构造函数来创建一个Bird对象

function Bird(name) { 
   var me = this; 
   this.name = name; 
   this.flying = false; 
   this.fly = function() { me.flying = true; }; 
}

Bird.prototype.fly = function() { this.flying = true; }

Bird.prototype.land = function() { this.flying = false; }
如果我们查看此对象的详细信息(您可以使用console.dir(obj)或使用Chrome开发工具来执行此操作):

现在考虑创建另一个实现对象BID的Boin对象。你会这样做的

function Duck(name) {
   this.name = name;
   this.quack = function() {
      console.log("quack");
   }
}
如果查看此对象的详细信息,您会看到:

现在如果你想让鸭子飞起来,你还没有一个方法。您需要将鸭子的原型设置为鸟。你可以这样做:

function Duck(name) {
   this.name = name;
   this.quack = function() {
     console.log("quack");
   }
}

Duck.prototype = new Bird();
现在,当您查看对象的详细信息时,您将看到原型现在设置为bird

简言之,原型用于提供对象之间的代码重用。来自面向对象背景的程序员可以使用原型提供与继承相同的机制。Mozilla有一个深入研究的好方法

返回函数是如何工作的?

Javascript是一种函数式编程语言。函数式编程范式的原则之一是将存在函数作为第一类对象。除其他外,这意味着函数与任何其他对象的处理方式相同

返回函数的函数与返回字符串的函数没有什么不同

 function getString() {
      return "I am a string";
    }
您可以选择任何方式使用此函数的结果。返回函数的函数也是这样

function getFunctionToGetSomethingImportant() {
  return function() {
    return "I am something important";
  }
}
现在,当您想要获得一个返回函数的函数,该函数执行一些重要的操作时,您可以执行以下操作:

var x = getFunctionToGetSomethingImportant();
x();
尽管这些用例没有什么价值,但使用函数作为第一类对象是非常有价值的。函数可以像其他对象一样处理,这意味着它们可以作为参数传递给其他函数(一个称为高阶函数的概念)

函数过滤器(列表、函数(元素){
返回元素<0;
});

函数过滤器将采用元素参数的函数作为其第二个参数。过滤器的一个实现将遍历列表中的每个元素,并应用作为第二个参数的函数。这是函数作为第一类对象的许多重要用例的一个示例。本文包含更多信息。

“F.prototype是什么意思……返回函数如何工作”这是两个截然不同的问题。你在问什么?欢迎来到函数式编程!!!要了解更多信息,请参见此链接-检查此处
-1
-此答案实际上没有解释任何问题,只是一堆代码碰巧使用了前面提到的一些语言功能。在函数原型中定义属性与在函数中定义属性不同,使用
this
。对,不完全相同。这将覆盖原型属性和方法。
this.prototype=newbird(name)是错误的。它应该是
Duck.prototype
,并且应该放在构造函数之外。您并不是在这里真正设置原型。您只是在创建的对象上创建一个名为
prototype
的属性。
function Duck(name) {
   this.name = name;
   this.quack = function() {
      console.log("quack");
   }
}
function Duck(name) {
   this.name = name;
   this.quack = function() {
     console.log("quack");
   }
}

Duck.prototype = new Bird();
 function getString() {
      return "I am a string";
    }
function getFunctionToGetSomethingImportant() {
  return function() {
    return "I am something important";
  }
}
var x = getFunctionToGetSomethingImportant();
x();
function filter(list, function(element) {
      return element < 0;
   });