【问题标题】:What is the difference between assigning a function via "this" vs. "prototype"? [duplicate]通过“this”与“prototype”分配函数有什么区别? [复制]
【发布时间】:2011-05-15 07:09:47
【问题描述】:

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

我对这两种向函数添加方法感到困惑。让我用一个例子来解释。

var foo = 函数(){ this.bar = function(){alert('我是一个方法')} } foo.prototype.baz = function(){alert('我是另一种方法')} var car = new foo();

现在我们可以对 car 使用 baz 和 bar 方法。好吧,但是它们之间有什么区别。向函数原型或构造函数添加方法的细微差别是什么。

谢谢..

【问题讨论】:

    标签: javascript oop function prototype constructor


    【解决方案1】:
    var foo = function(){
        this.bar = function(){alert('I am a method')}
    }
    

    这为每个 foo 实例提供了一个自己的 bar 方法。所以,

     var car1 = new foo();
     var car2 = new foo();
     car2.bar = //new function definition here.
     //car1.bar doesn't change.
    

    第二种情况:

    foo.prototype.baz = function(){alert('I am another method')}
    

    您正在将一个函数附加到 function foo 的原型链。因此,每个实例都获得相同的方法。 更改 baz 将更改每个实例上的函数,因为每个实例都继承相同的函数。

    第二种方法的优势在继承方面很明显。此外,在第一种方法中,由于您将一个方法附加到每个特定实例,因此如果您创建多个 foo 实例,它将无法扩展,因为每个实例都不必要地拥有相同方法的副本。

    【讨论】:

    • 错误。重新分配实例成员将隐藏该实例的原型。
    • 所以在这两个满意的答案之后,我会明白,如果添加一个带有原型的方法,所有实例都共享该方法,这是关于内存管理问题。我说的对吗?
    • @Lorenzo:除非您创建数百万个实例,否则不要担心。
    • @SLaks 我知道重新分配实例成员会隐藏原型。但我的意思是对函数 baz 的更改是实时的,这意味着实例会自动继承新的函数定义。
    • @Rajat:你的意思是改变原型吗?如果是这样,你应该澄清。
    【解决方案2】:

    分配给prototype 的函数将由所有实例共享;在构造函数中分配的函数每个实例都有一个单独的函数对象。

    另外,在构造函数中赋值的函数可以使用构造函数的变量和参数。

    例如:

    var foo = function(param){
        this.bar = function() { alert('I can see a parameter: ' + param); };
    }
    
    foo.prototype.baz = function() { alert('I can't see foo's parameters'); };
    
    var car = new foo("Hi there!");
    car.bar();
    

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2013-08-09
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2011-05-04
      • 2010-11-06
      相关资源
      最近更新 更多