对象文字符号与原型速度和内存

object literal notation vs prototype speed and memory

本文关键字:速度 内存 原型 文字 符号 对象      更新时间:2023-09-26

我看到了这篇文章http://www.webmasterworld.com/javascript/3066162.htm关于如何在javascript中实例化一个对象文字如果它中定义了方法,那么每次实例化一个时,它的方法也会被复制。因此,如果您有一堆对象文字的实例,那么复制的方法就会开始在内存中累积。

他/她说,使用原型来制作方法更有效,因为方法不是为构造函数对象的每个实例复制的。

这是真的吗?因为我的印象是,原型允许您添加属性/方法,即使在对象被实例化之后,而不是在第一次创建对象时在对象内。

当您创建这样的对象时:

function Car(c) {
   this.color = c;
   this.drive = function() {};
}

实际上,你正在为你创建的每辆车创建一个驱动功能的副本。在Javascript中,每个对象都有一个原型指针,来自该原型的属性/方法沿着树传播到子对象。

当你这样做:

function Car(c) {this.color=c};
Car.prototype.drive = function {};

然后创建一些汽车对象,你最终得到的是:

{drive:function(){}}/|''car1(红色)car2(蓝色)car3(绿色)

drive功能在所有Car对象之间共享。遗憾的是,在Javascript中这样做的语法太尴尬了。

这是真的,这就是为什么存在prototype

// define Function foo
function Foo()
{
    this.x = 1;
    this.bar = 'bar';
}
// define method on Foo's prototype
Foo.prototype.helloBar = function()
{
    alert(this.bar);
}

var foobar = new Foo();
foobar.helloBar(); // alerts "bar"

使用CCD_ 3防止了与为每个实例CCD_ 5重新定义CCD_ 4相关联的不必要的额外比特。

在构造函数的原型上定义方法与其他语言中的类定义类似。例如,Java类中定义的方法由该类的所有实例共享。在Javascript中,构造函数原型上定义的方法由该构造函数创建的所有实例共享。

上面示例中的主要区别在于变量声明。原型上定义的变量将在实例之间共享,因为类的每个实例都有自己的类定义中变量的副本。

最简单的理解方法是通过一些实验。http://jsfiddle.net/3vn4A/

在Firefox中,对象可以通过__proto__指针直接访问其原型。Object.getPrototypeOf(obj)是对象以编程方式引用其原型的标准方式。