我想了解这里发生了什么:
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意味着什么......返回一个函数如何工作
答案 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开发人员工具):
现在考虑要创建另一个实现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();
现在,当您查看对象的详细信息时,您将看到原型现在设置为bird。
简而言之,原型用于在对象之间提供代码重用。来自面向对象背景的程序员可以使用原型来提供与继承相同的机制。 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