【问题标题】:What’s the purpose of prototype? [duplicate]原型的目的是什么? [复制]
【发布时间】:2012-01-16 00:50:49
【问题描述】:

可能重复:
Use of 'prototype' vs. 'this' in JavaScript?

好的,所以我对 JS 中的 OOP 的想法有些陌生。

下面写的这两个sn-ps代码有什么区别:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}
function animal(){
    this.name = 'rover';
}
animal.prototype.set_name = function(name){
    this.name = name;
}

他们都做同样的事情,那么有什么区别?

【问题讨论】:

  • 类的实例级共享成员(非静态)。例如)Person.prototype.instance_counter = 0; //不能像Person.instance_counter这样的类名访问(这是静态的)

标签: javascript prototype-programming


【解决方案1】:

使用原型可以更快地创建对象,因为原型上的属性/方法不必在每次创建新对象时都重新创建。

当你这样做时:

function animal() {
    this.name = 'rover'
    this.set_name = function (name) {
      this.name = name
    }
}

每次创建动物时都会创建set_name 方法。但是当你这样做时

animal.prototype.set_name = function (name) {
    this.name = name
}

该方法不必每次都重新创建;它存在于原型中的一处。因此,当您调用 someAnimal.set_name("Ubu"); 时,this 上下文将设置为 someAnimal 并且(唯一的)set_name 方法将被调用。


使用第一种语法有一个优点:以这种方式创建的方法将可以访问私有数据:

function animal() {
    var privateData = 'foo'

    this.name = 'rover'
    this.set_name = function (name) {
        this.name = name
        alert(privateData) //will alert 'foo'
    }
}

Douglas Crockford 将这样创建的方法称为“特权”,因为它们可以访问公共和私有数据。

【讨论】:

    【解决方案2】:

    从这些函数创建新对象时会出现差异

    var animal1 = new animal();
    

    第一个函数创建的所有对象都将具有不同的name 和set_name 属性。但是,由第二个函数创建的所有对象都将共享 set_name 属性。

    【讨论】:

      【解决方案3】:

      在第一个示例中,每个单独的动物都有自己的 set_name 函数属性,而在第二个示例中,它们通过原型共享相同的函数。

      第一个版本的优点是方法可以访问在构造函数中声明的本地(私有)变量。

      第二种方法的优点是它需要更少的内存(因为您只存储该方法一次而不是一百万次)并且在当前的 JS 引擎中具有更高的性能。

      使用第二种方法,您还可以修改或向类添加方法,这也会影响已创建的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 2011-06-28
        • 2020-05-25
        相关资源
        最近更新 更多