Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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 Function和Function.prototype之间的差异_Javascript_Prototype_Prototype Chain - Fatal编程技术网

Javascript Function和Function.prototype之间的差异

Javascript Function和Function.prototype之间的差异,javascript,prototype,prototype-chain,Javascript,Prototype,Prototype Chain,根据,函数继承自函数,而函数继承自函数。原型依次为: 全局函数对象没有自己的方法或属性,但是,由于它本身是一个函数,因此它通过原型链从函数.prototype继承了一些方法和属性 那么,功能原型的意义是什么呢?为什么不将其属性移动到函数,并将Function.prototype设置为未定义?函数将从函数派生 对象等也是如此。原型上的函数只创建一次,并在每个实例之间共享。在构造函数中创建的函数将作为使用构造函数创建的每个新对象的新对象创建 一般来说,函数应该在原型上,因为它们通常不会针对同一类型的

根据,函数继承自
函数
,而
函数
继承自
函数。原型
依次为:

全局
函数
对象没有自己的方法或属性,但是,由于它本身是一个函数,因此它通过原型链从
函数.prototype
继承了一些方法和属性

那么,
功能原型的意义是什么呢?为什么不将其属性移动到
函数
,并将
Function.prototype
设置为
未定义
?函数将从
函数
派生


对象
等也是如此。

原型上的函数只创建一次,并在每个实例之间共享。在构造函数中创建的函数将作为使用构造函数创建的每个新对象的新对象创建

一般来说,函数应该在原型上,因为它们通常不会针对同一类型的不同对象进行修改,这对内存/性能有一点好处。其他属性(如对象和数组)应该在构造函数中定义,除非您想要创建共享的静态属性,在这种情况下,您应该使用原型

更容易看出与普通对象或数组的区别,而不是与函数的区别

function Foo(){
  this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //[]
as opposed to:

function Foo(){
}

Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]
函数继承自
函数

您引用的MDN不严格。它实际上说的是:

函数对象继承自
function.prototype

请注意,在MDN页面上,上面句子中的首字母“function”是大写的,但这只是因为它位于句子的开头,而不是因为它指的是JS对象
function
。它指的是声明为
function(){}
的常规旧函数

记住,MDN是由凡人编写的。我希望他们不要使用“继承”和“继承”这两个词,更不要说“派生”。JS没有严格意义上的继承概念。如果你使用这个术语,你最终会把自己弄糊涂。JS拥有的是与对象关联的原型。在访问对象上的属性时,如果未找到该属性,将参考原型。如果没有找到原型,因为原型也是带有原型的对象,所以会参考原型的原型,以此类推

因此,上面的句子最好写为“函数对象作为其原型
函数.原型

JS
函数
对象与
函数.prototype
没有直接关联,除了
函数.prototype
函数
的一个属性之外,而且由于
函数
对象本身就是一个函数,因此它本身就有
函数.prototype
作为它的原型。无论
函数
上存在或不存在任何属性,或您挂起的属性,都与原型链无关,任何人都不会“继承”

执行
(function(){}).call()
时,首先在函数对象本身上查找
调用
属性/方法;如果它不存在(通常不存在),则在声明函数时,会在内部分配的原型上查找它,即
function.prototype
。如果未启用
函数,您还会将
调用
应用
等方法放置在其他什么位置。原型
?除了
Function.prototype
,您还可以将自动分配给函数的原型称为什么

另请注意,
Function.call
将正确解析为内部
call
函数。为什么?这不是因为
调用
存在于此,也不是因为这是常规函数“继承”
调用
的地方,而是因为,正如我前面提到的,
函数
本身就是一个函数,因此具有原型
函数。原型
调用
可以在原型链上找到

那么,
功能原型的意义是什么呢?为什么不将其属性移动到
函数
,并让
函数.prototype
未定义?函数将从
函数
派生


X.prototype
是X上的一个属性,用作使用X作为构造函数创建的对象的原型。因此,要将正确的原型分配给使用
函数
作为构造函数创建的对象(包括声明为
函数x(){}
)的函数,原型必须作为<代码>原型> <代码>属性> <代码>函数> />代码>

您需要<代码>函数。原型< /代码>如果要扩展函数,请考虑:

Function.prototype.moo = 5;
function x() { };
console.log(x.moo); // 5
您现在创建的每个函数都具有属性
moo
,而不是:

Function.quack = 6;
function b() {};
console.log(b.quack); // undefined

如果只是在
函数
上添加一个属性,则情况并非如此。并非每个函数都继承分配给
函数的属性,这就是您需要
函数的原因。prototype

我认为这是因为原型属性在所有实例之间共享,而不是每个实例的本地实例属性。>“函数将从函数派生”。相信这是你困惑的根源。不知道你在哪里读到的,但是函数不能从原型意义上的函数派生。@nikc.org好的,但是为什么从
Function.prototype
?或者如果我们使用
f.prototype=Function
,其中
f
是一个函数,那么这些属性不是真的继承了吗?我的意思是,如果你想从一个函数继承,你可以做
f.prototype=super\u f
,而不是
f.prototype=super\u f.prototype
,对吗?@Geert-Jan我在读“JavaScript:Good Parts”。你不能把一个随机对象作为原型吗?@downvort为什么是downvot