我遇到过这篇文章http://www.webmasterworld.com/javascript/3066162.htm 关于如何在javascript中实例化一个对象文字,如果它有定义的方法,那么每次实例化一个对象文字时,它的方法也会被复制。所以如果你有一堆对象文字的实例,那么复制的方法就会开始在内存中加起来。
他/她如何声明使用原型来使您的方法更有效,因为不会为构造函数对象的每个实例复制方法。
这是真的吗?因为我的印象是,即使在对象被实例化之后,原型也允许你添加属性/方法,而不是在第一次创建对象时添加属性。答案 0 :(得分:15)
创建这样的对象时:
function Car(c) {
this.color = c;
this.drive = function() {};
}
您实际上是为您创建的每辆车创建了一个驱动功能的副本。在Javascript中,每个对象都有一个原型指针,该原型中的属性/方法从树向下传播到子对象。
当你这样做时:
function Car(c) {this.color=c};
Car.prototype.drive = function {};
然后创建一些你最终得到的汽车对象:
{drive: function(){}} / | \ car1 (red) car2 (blue) car3 (green)
drive
函数在所有Car对象之间共享。令人遗憾的是,在Javascript中执行此操作的语法非常尴尬。
答案 1 :(得分: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"
使用Foo.prototype
可以防止与每个实例hellobar
重新定义new Foo()
相关的不必要的额外位。
答案 2 :(得分:1)
在构造函数的原型上定义方法与其他语言中的类定义类似。例如,Java类中定义的方法由该类的所有实例共享。在Javascript中构造函数的原型上定义的方法由从该构造函数创建的所有实例共享。
上面示例中的主要区别是变量声明。在原型上定义的变量将在实例之间共享,因为类的每个实例都将在类定义中拥有自己的变量副本。
最简单的理解方法是通过一些实验。 http://jsfiddle.net/3vn4A/
在Firefox中,对象可以通过__proto__
指针直接访问他们的原型。 Object.getPrototypeOf(obj)
是对象以编程方式引用其原型的标准方法。