关于Javascripts Prototype的几个问题

时间:2012-06-29 11:44:45

标签: javascript prototype

我从经典的OOP背景来看Javascript并且在理解原型方面遇到了麻烦。

给出下面的代码示例:

  1. 我如何在foo中调用/执行bar?
  2. 为什么要使用“特权”功能而不是把它放在原型上?
  3. 这可能在第一季回答,但bar1和bar2可以互相呼叫吗?

    function foo()
        {
           this.property = "I'm a property";
    
           this.privileged = function()
           {
              // do stuff
           }
        }
    
        foo.prototype.bar = function()
        {
           // do stuff
        }
    
        foo.prototype.bar2 = function()
        {
           // stuff
        }
    

4 个答案:

答案 0 :(得分:4)

到目前为止,有很多关于此事的FUD。

1)。简单用法:

var xxx = new foo();  // Create instance of object.
xxx.privileged();  // Calls the internal closure.
xxx.bar();  // First looks for internals, then looks to the prototype object.

2)。这基本上创建了一个只能在实例上修改的闭包。根本不是私有的(因为任何东西都可以通过对象实例与它交谈),而是函数的单个副本,其中对象的每个实例都获得该函数的新副本。您可以更改函数本身,但不能全局更改它。我不是这种创造方法的忠实粉丝。

3)。是:

foo.prototype.bar = function(){
    this.bar2();
}

foo.prototype.bar2 = function(){
    this.bar();
}
// Although... NEVER do both.  You'll wind up in a circular chain.

为了启发,我为你建立了一个小提琴,它可以帮助显示事物的调用方式: http://jsfiddle.net/7Y5QK/

答案 1 :(得分:2)

1)frist是Clyde Lobo的回答:

var f = new foo();
f.bar();

2)在consturctor(特权)上编写一个函数,每个实例都会创建一个新函数,如果在prototype上定义了一个方法,则每个实例共享相同的prototype方法:

var f1 = new foo(), // instance 1
    f2 = new foo(); // instance 2

f1.privileged === f2. privileged // -> false , every instance has different function
f1.bar === f2.bar // -> true, every instance share the some function

3)你可以在bar2 this.bar()`中调用bar' by,代码如下:

function foo() {
   this.property = "I'm a property";

   this.privileged = function() {
      // do stuff
   };
}

foo.prototype.bar = function() { // defined a method bar
    alert('bar called');
    this.bar2(); // call bar2
};

foo.prototype.bar2 = function() { // defined a method bar2
    alert('bar2 called');
};

var f = new foo();
f.bar(); // alert 'bar called' and 'bar2 called'
f.bar2(); // alert 'bar2 called'

答案 2 :(得分:1)

  1. 您可以通过this.bar();执行foo中的bar 但它只有在您使用new foo();并且具有从foo继承的对象时才有效。否则,如果您只是致电foo();this将指向全局对象。

  2. 基本上相同的是,只有你在函数中赋予继承对象的属性和方法才能访问传递给foo的任何参数。

  3. 是的,他们可以互相打电话,因为功能是“悬挂的”。他们可以访问最近的外部范围内的所有变量和对象,以及它们的功能上下文。

  4. 您的代码中确实存在语法错误。在分配原型的地方,您没有创建函数。你的意思是:

    foo.prototype.bar = function() { /* ... */ };
    

答案 3 :(得分:0)

1.您可以创建foo的实例,如

var f = new foo();

然后致电f.bar()f.bar2()

点2& David已经解释过3