这.bla和Object.prototype.bla有什么区别?

3

假设我有这段代码:

(function(global) {
    function Bar(foo) {
        this.foo = foo;
        return this;
    }

    Bar.prototype.getFoo = function() {
        return this.foo;
    };

    Bar.prototype.setFoo = function(val) {
        return (this.foo = val);
    };
})(this);

创建类似setFoo这样的函数,使用prototype和直接编写有什么不同之处?
function Bar(foo) {
    this.getFoo = function() {
        return this.foo;
    };
}

我知道原型是什么以及它的含义,但我无法理解为什么有些人使用原型来分配函数,因为如果我使用this进行分配,那么每次创建Bar的新实例时,它们也将可用。


3
你的方式是为每个Bar实例创建单独的函数。而原型方式只为所有实例创建一个函数。这样可以节省内存。 - freakish
4个回答

2

简单回答 = 函数共享 + 更小的内存占用

当您使用 prototype.functionName 时,所有实例共享相同的函数(在内存中只有一个副本),但是如果您在构造函数中使用 this.functionName,每个实例都有自己的相同函数的副本(在内存中存在多次)。

使用 prototype 有两个影响:

  1. 内存占用 - 如上所述
  2. 对原型进行后续函数更改会反映在所有现有(和未来的)实例上 - 在极少数情况下,人们可能希望这样做,但它确实存在并且可以使用

高级 - 您可以同时拥有两者

您还可以同时拥有两者,此时本地副本优先于原型,这意味着您可以执行以下操作:

function Crazy(name)
{
    this.name = name;
    this.callMe = function() {
        return "Where are you " + this.name;
    };
}

Crazy.prototype.callMe = function() {
    return this.name + " come here";
};

var inst = new Crazy("Robert");
inst.callMe(); // "Where are you Robert"
delete inst.callMe;
inst.callMe(); // "Robert come here"

1
当你使用prototype时,函数是共享的,当你将函数分配给this时,它们不是共享的。相反,每个实例都有自己的副本

0
一个旁注:
使用原型继承时,自有属性和继承属性之间存在根本性的区别。
有时这可能非常重要。
经常使用的经典for循环仅检查“自有属性”,采用以下形式:
for (prop in array) {
if (array.hasOwnProperty(prop)) {
      dostuff
}

当分配给this时,所有属性都是自有属性,使得hasOwnProperty检查无关紧要。


0
如果您有多个“类”的实例(使用术语不严谨),它们都共享相同的原型。因此,在那里附加东西更轻量级,并且它保证它们都具有相同的版本(如果这是您想要的)。将其视为实例字段与类字段。
原型还可以链接以允许字段的“继承”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接