在对象

时间:2016-07-01 18:21:13

标签: javascript object prototype

有没有办法通过另一个对象公开对象的原型?

  var foo = function () {
    var foo = {
      bar: bar,
      boo: boo
    }
    return foo;

    function bar (age) {
      this.age = age;
    }
    bar.prototype.shoutAge = function () {
      alert('My age is ' + this.age);
    }

    function boo (age) {
      this.age = age;
      boo.prototype.shoutAge = function () {
        alert('My age is ' + this.age);
      }
    }
  }

  var foo = foo();
  var far = new foo.bar(13); // bar {age: 13}
  far.shoutAge(); // far.shoutAge is not a function

  var far = new foo.boo(13); // boo {age: 13} with __proto__
  far.shoutAge(); // alert('My age is 13'); 

在这段代码中,'bar'对象设置了原型继承 - 但是暴露栏失去了'shoutAge'的继承。

但是,'boo'对象在其中声明了原型,而外部函数可以访问方法'shoutAge'

即使它起作用,我也不认为后者是最佳实践。那么这里的最佳做法是什么?

我不希望'bar'的每个实例都拥有它自己的'shoutAge'方法,特别是如果有可能有数百个'的实例酒吧'的。您是否通常只为'bar'创建一个单独的对象,而不是通过'foo'公开它?

1 个答案:

答案 0 :(得分:3)

看起来这只是一个操作订单问题:

var Foo = function () {

  function bar (age) {
    this.age = age;
  }
  bar.prototype.shoutAge = function () {
    alert('My age is ' + this.age);
  }

  var foo = {
    bar: bar,
    boo: boo
  }
  return foo;
}

我认为这是因为bar.prototype赋值永远不会在您的代码中执行。 bar函数定义获取hoisted,因此它在您返回的对象中可用,但原型赋值是return语句后的附加语句,控制流从不到达它。只需将return移到最后就可以解决问题。