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

zer*_*ero 9 javascript oop object

我发现这篇文章http://www.webmasterworld.com/javascript/3066162.htm 关于如何在javascript实例化一个对象文字,如果它有定义的方法然后每次实例化它的方法也被复制.因此,如果你有一堆对象文字的实例,那么复制的方法将开始在内存中加起来.

他/她如何声明使用原型来使您的方法更有效,因为不会为构造函数对象的每个实例复制方法.

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

tak*_*eek 15

当您创建这样的对象时:

function Car(c) {
   this.color = c;
   this.drive = function() {};
}
Run Code Online (Sandbox Code Playgroud)

您实际上是为您创建的每辆汽车创建驱动器功能的副本.在Javascript中,每个对象都有一个原型指针,该原型中的属性/方法从树向下传播到子对象.

当你这样做时:

function Car(c) {this.color=c};
Car.prototype.drive = function {};
Run Code Online (Sandbox Code Playgroud)

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

            {drive: function(){}}
             /        |           \
      car1 (red)    car2 (blue)    car3 (green)

drive函数在所有Car对象之间共享.令人遗憾的是,在Javascript中执行此操作的语法非常尴尬.


xan*_*ded 10

这是真的,这就是为什么有一个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"
Run Code Online (Sandbox Code Playgroud)

使用Foo.prototype可防止与重新定义hellobar每个实例相关的不必要的额外位new Foo().

  • @codewombat:没错.`prototype`对象在从同一构造函数创建的所有对象之间共享.他们*引用它来访问他们自己不拥有的属性. (3认同)