在对象中公开原型

Expose prototypes in object

本文关键字:原型 对象      更新时间:2023-09-26

是否有一种方法可以通过另一个对象暴露对象的原型?

  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'对象被设置为原型继承——但是暴露bar会失去' sh停用'的继承。

但是,'boo'对象内部声明了原型,并且外部函数可以访问' sh停用'方法。

我不认为后者是一个最佳实践,即使它的功能。那么最好的做法是什么呢?

我不希望'bar'的每个实例都有自己的' sh停用'方法,特别是当'bar'可能有数百个实例时。你通常会为'bar'创建一个单独的对象,而不是通过'foo'来暴露它吗?

看起来这只是一个操作顺序问题:

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函数定义被提升,因此它在您返回的对象中可用,但是原型赋值是return语句之后的附加语句,并且控制流永远不会到达它。只需将return移到末尾即可解决此问题。