我很难想到我需要这样做的真实场景:
function foo() {};
foo.prototype.myFunction = function() { return something; };
而不是简单地这样做:
function foo() { this.myFunction = function() { return something; } };
我很难想到我需要这样做的真实场景:
function foo() {};
foo.prototype.myFunction = function() { return something; };
而不是简单地这样做:
function foo() { this.myFunction = function() { return something; } };
当您需要实例化大量“foo”对象时,一个很好的例子就是它产生巨大差异的地方。基于原型的解决方案将比第二个解决方案更快、更高效。
在这种情况下产生巨大差异的原因是,在第二个示例中,您为每个新实例创建一个新函数,而在第一个示例中,所有对象共享相同的函数。
需要使用基于原型的继承来提高性能的现实世界的一个很好的例子是像 jQuery 这样的库。在非平凡的 Web 应用程序中,您可以轻松地最终创建 2000 多个对象实例。想象一下,如果这些对象中的每一个都必须有自己的功能而不是共享它们。
让我们有两个实例foo
(实际上,因为它是一个构造函数,所以它应该大写;))
var myFoo1 = new foo();
var myFoo2 = new foo();
在第一种情况下,myFunction
是 infoo
的原型,因此内存中只存在此函数的一个实例。myFoo1
并且myFoo2
都可以将这个函数用于自己的目的,因为他们用不同的this
.
在第二种情况下,myFunction
每次创建实例时foo
都会创建一个新副本。内存中会有多个实例。
所以...如果将对象的方法(或只读成员变量,或简单的其他共享内容)放入原型中,它可以节省内存。另一方面,它也稍微减慢了成员查找速度——该函数并不直接存在于对象中,而是在其原型链上更上一层楼。
从来没有必要这样做,但有一些优点,也有缺点。
foo
一个优点:原型函数在从构造函数创建的所有对象之间共享。
foo
缺点:原型函数无法直接访问构造函数调用的直接变量范围内的变量。
除了使用prototype
构造函数之外,还可以在构造函数中直接分配函数,而无需为每个对象创建新函数。
你可以这样做...
var foo = (function() {
var myFunction = function() { return something; };
return function foo() { this.myFunction = myFunction; };
})();
这与原型函数具有相同的限制,因为myFunction
显然无法访问构造函数范围内的变量。