在JavaScript中使用“原型”还是“ this”?

之间有什么区别

var A = function () {
    this.x = function () {
        //do something
    };
};

var A = function () { };
A.prototype.x = function () {
    //do something
};
YOC405654072020/03/11 10:34:26

正如在其他答案中所讨论的那样,这实际上是性能方面的考虑,因为原型中的函数与所有实例共享-而不是为每个实例创建的函数。

我整理了一个jsperf来展示这一点。实例化类的时间有很大的不同,尽管实际上只有在创建多个实例时才有意义。

http://jsperf.com/functions-in-constructor-vs-prototype

神奇宝儿2020/03/11 10:34:26

考虑一下静态类型的语言,事物prototype是静态的,事物this是与实例相关的。

Stafan西门2020/03/11 10:34:26

我相信@Matthew Crumley是正确的。它们在功能上(如果不是在结构上)是等效的。如果您使用Firebug查看使用创建的对象,则new可以看到它们是相同的。但是,我的偏好如下。我猜想这似乎更像是我在C#/ Java中所习惯的。即,定义类,定义字段,构造函数和方法。

var A = function() {};
A.prototype = {
    _instance_var: 0,

    initialize: function(v) { this._instance_var = v; },

    x: function() {  alert(this._instance_var); }
};

编辑并不是要暗示变量的范围是私有的,我只是想说明如何在javascript中定义类。变量名称已更改以反映这一点。

逆天Jim2020/03/11 10:34:26

原型是该类的模板;这适用于它的所有未来实例。而这是对象的特定实例。

猪猪小卤蛋2020/03/11 10:34:26

我知道这已经死了,但我想展示一个实际的速度差异示例。

直接作用于对象

原型功能

在这里,我们使用printChrome中方法创建2,000,000个新对象我们将每个对象存储在一个数组中。放置print原型大约需要1/2倍的时间。

西门JinJin2020/03/11 10:34:26

第一个示例仅更改该对象的接口。第二个示例更改该类所有对象的接口。

猿小小2020/03/11 10:34:26

在大多数情况下,它们本质上是相同的,但是第二个版本可以节省内存,因为该函数只有一个实例,而不是每个对象都有单独的函数。

使用第一种形式的原因是访问“私人成员”。例如:

var A = function () {
    var private_var = ...;

    this.x = function () {
        return private_var;
    };

    this.setX = function (new_x) {
        private_var = new_x;
    };
};

由于javascript的范围规则,private_var可用于分配给this.x的函数,但不适用于该对象。