【问题标题】:A few questions about Javascripts Prototype关于 Javascript Prototype 的几个问题
【发布时间】:2017-08-29 00:16:33
【问题描述】:

我从经典的 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
        }
    

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

    直到今天还有很多关于这件事的 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/

    【讨论】:

    • jsFiddle 非常棒!我阅读了您的回答并认为“是的,有道理”。开始考虑“但是如果……”,而 jsFiddle 让我可以全面测试。很棒。
    【解决方案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) 可以在bar' bythis.bar()`中调用bar2,代码如下:

    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'
    

    【讨论】:

      【解决方案3】:
      1. 你可以通过this.bar();在foo中执行bar 但它只有在你使用new foo(); 并且有一个从foo 继承的对象时才有效。否则,如果你只是调用foo();this 将指向全局对象。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        var f = new foo();

        然后调用f.bar()f.bar2()

        第 2 点和第 3 点已经由 David 解释过

        【讨论】:

          猜你喜欢
          • 2012-08-31
          • 2011-05-12
          • 2011-08-24
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多