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;
    };
}

我知道原型是什么以及它的含义,我只是想不通,为什么有些人用原型分配函数,因为如果我用这个分配它们,每次我创建一个新的 Bar 实例时它们也将可用。

4

4 回答 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"
于 2012-10-19T09:23:05.507 回答
1

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

于 2012-10-19T09:22:39.563 回答
0

旁白:

对于原型继承,自己的属性和继承的属性之间存在根本区别。

有时这可能非常相关。

经常使用的经典 for 循环,仅检查“自己的属性”,采用以下形式:

for (prop in array) {
if (array.hasOwnProperty(prop)) {
      dostuff
}

分配给 时this,所有属性都是自己的属性,从而使 hasOwnProperty 检查无关紧要。

于 2012-10-19T09:36:17.797 回答
0

如果您有多个“类”实例(松散地使用该术语),它们都共享相同的原型。所以附加的东西更轻,它保证它们都有相同的版本(如果这是你想要的)。

将其视为实例字段与类字段。

原型也可以链接起来以允许字段的“继承”。

于 2012-10-19T09:13:38.977 回答