Javascript 您将';需要';原型函数与内部函数?

Javascript 您将';需要';原型函数与内部函数?,javascript,prototyping,Javascript,Prototyping,我很难想象现实世界中需要这样做的场景: function foo() {}; foo.prototype.myFunction = function() { return something; }; 而不是简单地这样做: function foo() { this.myFunction = function() { return something; } }; 当您需要实例化许多“foo”对象时,这是一个很好的例子,说明了它在哪些方面起到了巨大的作用。基于原型的解决方案将比第二个解决方案更快

我很难想象现实世界中需要这样做的场景:

function foo() {};
foo.prototype.myFunction = function() { return something; };
而不是简单地这样做:

function foo() { this.myFunction = function() { return something; } };

当您需要实例化许多“foo”对象时,这是一个很好的例子,说明了它在哪些方面起到了巨大的作用。基于原型的解决方案将比第二个解决方案更快、更高效

在这种情况下产生巨大差异的原因是,在第二个示例中,您为每个新实例创建了一个新函数,在第一个示例中,所有对象共享相同的函数


现实世界中需要使用基于原型的继承来提高性能的一个很好的例子是类似jQuery的库。在非平凡的web应用程序中,您可以轻松地创建2000多个对象实例。想象一下,如果这些对象中的每一个都必须有自己的函数,而不是共享它们。

让我们有两个
foo
的实例(实际上,因为它是一个构造函数,所以应该大写;)

在第一种情况下,
myFunction
位于
foo
的原型中,因此内存中只存在该函数的一个实例
myFoo1
myFoo2
都可以出于各自的目的使用此函数,因为它们使用不同的
this
来调用此函数

在第二种情况下,每次创建
foo
的实例时,都会创建
myFunction
的新副本。内存中将有多个实例

所以。。。如果将对象的方法(或只读成员变量,或其他简单的共享内容)放入原型中,则可以节省内存。另一方面,它也会降低成员查找的速度—该函数不是直接出现在对象中,而是在其原型链上的一个步骤。

从来没有必要这样做,但它有一些优点,也有一些缺点

  • 一个优点是:原型函数在从
    foo
    构造函数创建的所有对象之间共享

  • 缺点:原型函数无法直接访问
    foo
    构造函数调用的即时变量范围内的变量


除了使用构造函数的
原型
,还可以在构造函数中直接赋值函数,而无需为每个对象创建新函数

你可以这样做

var foo = (function() {

    var myFunction = function() { return something; };

    return function foo() { this.myFunction = myFunction; };

})();

这与原型函数的限制相同,因为
myFunction
显然无法访问构造函数范围内的变量。

您不需要这样做,但这样做有好处(也有缺点)。这些函数在实例之间共享,所以它们属于原型。所有的答案都很好-谢谢:)所以如果我用不同的方式解释,原型可以节省内存,但可能会减慢处理速度?是的。它确实节省了内存,但这也是一个很好的设计决策:原型代表了这些对象的共同基础,因此它是一个放置共享内容的好地方。至于成员查找延迟,对于一般目的来说应该是无关紧要的。但是你可以试着对一万个对象进行基准测试。。。
var foo = (function() {

    var myFunction = function() { return something; };

    return function foo() { this.myFunction = myFunction; };

})();