JS OOP:原型上的方法与构造函数中的方法

时间:2014-06-20 23:22:39

标签: javascript oop constructor prototype

我先举两个例子。

示例1:

function Gallery() {
    this.a = "I am 'A'";

    this.trace = function() {
        console.log(this.a);
    }
}

示例2:

function Gallery() {
    this.a = "I am 'A'";
}

Gallery.prototype.trace = function () {
    console.log(this.a);
}

显然,两件事都是一样的。我的问题是:在构造函数中使用方法定义而不是原型吗?到底有什么区别?

原型是否更符合内存?我假设如果我在构造函数中定义方法,那么每个 Gallery 实例都将拥有自己的实例'因此,该方法将消耗更多内存,而原型只定义了一个在所有 Gallery 实例中共享的函数。这是对的吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

构造函数中的方法定义较慢,因为每次创建新对象时都会执行它。

另一方面,使用prototype,VM可以优化对它的访问,以优化功能(因为它们已经共享 - 它无法做到如果每个实例都有自己的功能)。

(因为它已经被解释过了,所以没有太多细节,但基本上,VM(我知道v8这样做,不确定其他人做了什么)通常是一个"隐藏的课程" for每个原型,具有优化的字段,而不是仅仅将其作为任何=>任意的地图

这也允许在以后添加功能时具有更大的灵活性。

在对象上添加方法的唯一好处是你可以假装"私有"领域更容易。

答案 1 :(得分:0)

如果你将Gallery放在构造函数中,那么每个.trace()对象都有自己的.trace()函数对象,这是正确的,因此在{{1}中创建方法更有效除非你绝对想要使用封装来隐藏传递给构造函数的参数,而不是将它们保存为实例上的属性。 .prototype对象也更易于浏览器优化。

这两种方法在实践中几乎无法区分除非编码器尝试使用他的JavaScript控制台检查您的JavaScript代码,在这种情况下,他们将更容易阅读{ {1}}对象而不是构造函数内部与所有内容完全相同。记住你的意思。