3

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

给定下面的代码示例:

  1. 我将如何在 foo 中调用/执行 bar?
  2. 为什么要使用“特权”功能而不是将其放在原型上?
  3. 这可能在 Q1 中得到了回答,但是 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

4 回答 4

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/

于 2012-06-29T12:21:31.950 回答
2

1)首先是克莱德·洛博(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)你可以调用this.bar()` bar2bar' 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'
于 2012-06-29T12:35:14.403 回答
1
  1. 您可以通过 do 在 foo 中执行 bar ,this.bar(); 但仅当您使用new foo();并拥有一个继承自foo. 否则,如果您只是调用foo();,this将指向全局对象。

  2. 本质上是一样的,只是您在函数内部为继承对象提供的属性和方法可以访问您传递给的任何参数foo

  3. 是的,他们可以互相调用,因为函数是“提升的”。他们可以访问最近的外部范围内的所有变量和对象,以及它们的功能上下文。

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

foo.prototype.bar = function() { /* ... */ };
于 2012-06-29T11:53:17.853 回答
0

1.你可以创建一个foo的实例

var f = new foo();

然后打电话f.bar()f.bar2()

大卫已经解释了第 2 点和第 3 点

于 2012-06-29T12:06:10.390 回答