javascript - JS面向对象: methods on prototype vs methods in constructor function

标签 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);
}

显然,两者的作用是相同的。我的问题是:与原型(prototype)函数相比,在构造函数中使用方法定义有什么缺点吗?到底有什么区别?

原型(prototype)对内存更友好吗?我假设,如果我在构造函数内定义该方法,则每个 Gallery 实例都将拥有该方法的“自己的实例”,因此将消耗更多内存,而原型(prototype)仅定义一个在所有实例之间共享的函数Gallery 实例。这是正确的吗?

非常感谢!

最佳答案

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

另一方面,通过原型(prototype),虚拟机将能够优化对其的访问,优化功能(因为它们是共享的 - 如果每个实例都有自己的功能)。

(不再详细介绍,因为已经解释过,但基本上,VM(我知道 v8 是这样做的,不确定其他人做什么)通常会为每个原型(prototype)提供一个带有优化字段的“隐藏类”,而不是只是将其作为任何 => 任何的 map )

这也为以后添加功能提供了更大的灵 active 。

在对象上添加方法的唯一好处是您可以更轻松地伪造“私有(private)”字段。

关于javascript - JS面向对象: methods on prototype vs methods in constructor function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337020/

相关文章:

javascript - 使用方法将 JSON 字符串转换为对象

java - 关于如何管理代码的 Android 最佳实践 - 在 Activity 类或 Object 类中?

php - 如何在 Codeigniter 中仅禁用特定方法的构造函数?

c++ - C++中如何让类的成员函数每次调用时生成不同的随机数?

c# - 公共(public)变量与带有访问器的私有(private)变量

当类具有另一个类的数组时,C++ 复制构造函数

javascript - 获取所选内容的 html(源代码)索引?

javascript - Amchart 类别轴中的时间戳显示为“未定义”

javascript - 无法从父组件方法访问状态

javascript - 纯 Javascript - 单击按钮/输入键时将文本输入的值添加到 <li>