0

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

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 是什么意思...返回函数是如何工作的

4

3 回答 3

3

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

F.prototype 是什么意思?

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

默认情况下,所有 Javascript 对象都包含一个原型字段。原型字段始终初始设置为基础 Object 对象。(您可以通过do var x = new Object()或do 来创建一个新的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 开发人员工具来完成):

鸟构造器的详细信息

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

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

如果您查看此对象的详细信息,您会看到:

鸭子构造器

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

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

Duck.prototype = new Bird();

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

鸭子构造函数 2

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

返回函数是如何工作的?

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

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

于 2013-07-22T22:00:59.730 回答
0

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

F.prototype = o

F as 类获取对象 o 的属性

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

这与您将 F 定义为一样

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

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

于 2013-07-22T21:44:36.487 回答
-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
于 2013-07-22T21:26:25.940 回答