代码之家  ›  专栏  ›  技术社区  ›  anivas

构造函数函数闭包变量

  •  0
  • anivas  · 技术社区  · 10 年前

    对于下面的函数,我希望a和b有自己的数组版本,因此希望输出为false,但输出为true。谁能解释一下,为什么?

     function Test() { 
        var a = [1,2,3]; 
        Test.prototype.getArray = function() { return a; };
     }
    
    var a = new Test();
    var b = new Test();
    
    console.log(a.getArray() === b.getArray());
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Mike Cluck    10 年前

    每一个 Test 对象继承相同的原型。这个 准确的 相同的原型。因为您要覆盖原型函数,所以它会覆盖该类型的所有对象。

    例子:

    function log(msg) {
      document.querySelector('pre').innerText += msg + '\n';
    }
    
    function Person(name) {
      this.name = name;
    }
    Person.prototype.sayHello = function() {
      log('Hello, ' + this.name);
    };
    
    var bob = new Person('Bob');
    var alice = new Person('Alice');
    bob.sayHello();
    alice.sayHello();
    
    // Overwriting the prototype function
    Person.prototype.sayHello = function() {
      log('Goodbye, ' + this.name);
    };
    bob.sayHello();
    alice.sayHello();
    <pre></pre>

    如果绝对需要使用标准构造函数访问函数中的私有数据,则需要在构造函数本身中定义函数。

    function Test() {
      var a = [1,2,3];
      this.getArray = function() {
        return a;
      };
    }
    

    请注意,这会抵消许多实现中原型继承所带来的大量空间和性能优化。