javascript中原型的含义

时间:2012-07-18 12:32:13

标签: javascript

我从reader编写了Person的简短继承代码:

<script>

/* Class Person. */
function Person(name) {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name;
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

或者,我可以删除Person.prototype.getName = function() { return this.name; }行,并在Person对象中创建它。例如

<script>
/* Class Person. */
function Person(name) {
    this.name = name;
    this.getName = function() { return this.name;}
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

在这两种情况下调用getName()时,我得到了相同的结果。那他们有什么不同呢?

6 个答案:

答案 0 :(得分:21)

当您在原型上添加某些内容时,对象的每个实例都会为该方法共享相同的代码。它们都使用相同的函数实例。

当您只在this上放置方法时,每个对象实例都有自己的副本相同的方法。

使用prototype效率更高。请注意,这就是为什么通常将方法放在原型上的原因,因为您通常希望所有实例都使用相同的方法,但属性放在实例本身上,因为通常您不希望所有实例共享相同的属性。

对于您的注释,如果您在对象的构造函数上放置一个方法,那么您实际上已经创建了一个“静态”方法。没有该对象的实例将具有该方法,它们都必须在构造函数上访问它。所以在你的情况下,Person.someMethod()

答案 1 :(得分:3)

不同之处在于,当您将其放在原型上时, Person的所有实例共享getName的相同代码 - 您可以更改getName所有实例Person上分配其他内容:

Person.prototype.getName = function() { return 'Mr Jones' };

此外,由于它们共享相同的代码,因此内存密集程度较低:您只有getName函数的一个副本,而不是每个实例一个副本。

另一个区别是你可以稍后将Person设置为另一个类的原型,比方说Man,它将继承属性/方法。

更新:这是一篇很好的文章,解释原型的其他属性:https://stackoverflow.com/a/1534286/295262

答案 2 :(得分:2)

区别在于你是否进一步扩展了Person类,子类不会继承getName()方法

编辑:我在上述声明中不正确。刚刚在jsfiddle上测试过。无论我们是在原型上还是在函数实例本身上定义方法,它都可用于链中的子类。

以下是证明:http://jsfiddle.net/u8qrd/

我知道将方法附加到原型有一个性能/内存的好处。那个公寓在继承方面没有任何行为差异吗?

(希望我在这里提问不违反SO规则)

答案 3 :(得分:2)

当你将方法放在构造函数中并从该构造函数中创建一个对象时,每个对象都带有它自己的getName函数。对于10个Person个实例,每个实例都带有自己的getName个,因此有10个单独的getName个函数。

如果将getName放在构造函数的原型中,则在所有实例中共享/继承相同的getName函数。因此,对于Person的10个实例,每个实例都有getName,但仅指1 getName个函数。

使用原型可以节省内存,因为该方法是跨实例共享的,所以只使用了一个。

答案 4 :(得分:0)

在基于类的单词中,通过prototypethis声明函数之间的区别是这样的:

<强>原型:

实例的功能如下所示:

somefunc = function(){super()/*call the function of the super-class*/};

<强>这样:

实例的功能如下所示:

somefunc = function(){/* Do same stuff as in the prototype func declared */};

现在更改原型上的函数对实例没有任何影响。

答案 5 :(得分:0)

将带有http://localhost/zendAuth/application/views/scripts/employee/add.phtml的任何函数添加到任何对象构造函数时,由该构造函数创建的每个对象都将自己复制该函数,这也会占用内存。想象一下,如果您有多个对象是由同一构造函数创建的,那么它将占用多少内存。另一方面,当您使用this.functionname创建函数时,函数在内存中仅加载一次,并且每个对象共享相同的原型函数构造函数。这种方法可以使您的代码在加载和操作中更快,并且可以节省大量内存。