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

时间:2013-07-22 21:22:33

标签: 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.');
        }
        F.prototype = o;
        return new F();
    };
}());

}

F.prototype意味着什么......返回一个函数如何工作

3 个答案:

答案 0 :(得分:3)

这是两个不同的问题。原型的概念及其含义与返回功能的概念是分开的。我会尽力尝试解释。

F.prototype是什么意思?

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

默认情况下,所有Javascript对象都包含一个原型字段。原型字段始终始终设置为基础Object对象。 (您可以通过执行创建Object的新实例 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开发人员工具):

Details of Bird Constructor

现在考虑要创建另一个实现Object Bird的鸟对象。你会做这样的事情。

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

如果你看一下这个对象的细节,你会看到:

Duck Construcotor

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

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

Duck.prototype = new Bird();

现在,当您查看对象的详细信息时,您将看到原型现在设置为bird。

Duck Constructor 2

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

如何返回某个功能?

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

返回函数的函数与返回字符串的函数没什么区别。

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

函数过滤器将带有元素参数的函数作为其第二个参数。 filter的实现将循环遍历列表中的每个元素,并应用作为第二个参数给出的函数。这是作为第一类对象的函数的许多重要用例的一个示例。这篇wiki文章包含更多信息。

答案 1 :(得分:0)

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

之后

F.prototype = o

F作为类获取对象的属性o

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

这就像你将F定义为

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

但在您的示例中,您可以根据传递给create()函数的对象类创建新对象

答案 2 :(得分:-6)

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

f = dostuff();
f();

--output:--
hello

Array.prototype.greet = function() {console.log('hello')};

[1, 2, 3].greet();

--output:--
hello

function Dog(name) {
  this.name = name;
  this.speak = function() {console.log('Ruff, ruff!') };
}

mydog = new Dog("Joey")
console.log(mydog.name);
mydog.speak();

--output:--
Joey
Ruff, ruff!

function Dog() {

}

Dog.prototype.speak = function() {console.log("Ruff, ruff!")};

mydog = new Dog();
mydog.speak();

--output:--
Ruff, ruff!

function Dog() {

}

var obj = {
  name: "Joey",
  speak: function() {console.log("Ruff, ruff!")}
}

Dog.prototype = obj;

mydog = new Dog();
console.log(mydog.name);
mydog.speak();

--output:--
Joey
Ruff, ruff!


obj.jump = function() {console.log("Look at me jump!")};
mydog.jump();

--output:--
Look at me jump!

var F = function() {

};

var o = {
  "greet": function() {console.log('hello')} 
};

F.prototype = o;
f = new F();
f.greet();

--output:--
hello