2012-06-29 66 views
3

我来自经典的OOP背景的JavaScript,并且在理解原型时遇到了麻烦。关于Javascripts原型的几个问题

考虑下面的代码示例:

  1. 我怎么会叫/ foo中执行吧?
  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

今天有很多关于这个的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/

+0

的的jsfiddle是优秀的!我读了你的答案,并认为“是的,有道理”。开始思考“但是如果......”和jsFiddle让我全面测试。优秀。 – JonWells

1
  1. 您可以通过执行this.bar(); foo中执行酒吧,但如果你使用new foo();它只会工作,并有一个对象从foo继承。否则,如果您只拨打foo();,则this会指向全局对象。

  2. 它本质上是一样的东西只有你给函数内部的继承对象的属性和方法可以访问你传递给foo的任何参数。

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

实际上,您的代码中有语法错误。在你分配原型的地方,你没有创建一个函数。您的意思是:

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

1.You可以像

var f = new foo();

,然后生成foo的实例调用f.bar()f.bar2()

分2 & 3已经由大卫

解释
2

1)第一页是有的克莱德路宝的答案:

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)你可以调用bar2bar' by this.bar()',这样的代码:

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'