Прототип наследования - PullRequest
0 голосов
/ 22 июля 2011

У меня есть этот объект, dive:

var dive = new Foo.Bar();

И Foo.Bar выглядит следующим образом:

var Foo = {
    Bar: function() {
        ...
        return function() {
        // do stuff, no return
        };
    }
};

Я бы хотел, чтобы dive имел все прототипыдругого существующего объекта, однако.Допустим, window.Cow.prototype это:

{
    moo: function() { ... },
    eat: function() { ... }
}

Что мне нужно сделать, чтобы Foo.Bar, чтобы я мог сделать это:

dive.moo();
dive.eat();

Ответы [ 4 ]

0 голосов
/ 25 июля 2011

Если вы хотите инкапсулировать Foo.Bar.prototype =, вы можете сделать это без изменения поведения конструктора по умолчанию:

function Cow() {
  this.talk =  function() {
    alert("mooo")
  }
}

var Foo = {
  Bar: function() {
    var constructor = function() {
      this.eat = function() {
        alert("gulp")
      }
    }
    constructor.prototype = new Cow()
    return constructor
  }()
}

var foo = new Foo.Bar()
foo.talk()
foo.eat()
0 голосов
/ 22 июля 2011

Вот рабочий пример без конструктора Bar jsFiddle

0 голосов
/ 22 июля 2011

Спасибо за начало, jimbojw! Вы были близки, но вы дали мне достаточно информации, чтобы получить ее:

function Cow() {
    return {
        talk: function() {
             alert("mooo");   
        }
    };   
}

var Foo = {
    Bar: function() {
        function result() {
            alert("Foo.Bar says...");
        };
        result.prototype = new Cow();
        return new result;
    }
};

new Foo.Bar().talk();
0 голосов
/ 22 июля 2011
var Foo = {
    Bar: function() {
        //...
        return this; // technically unnecessary, implied by 'new' operator
    }
};

Foo.Bar.prototype = new Cow(); // the secret sauce

dive = new Foo.Bar();

dive.moo(); // moo's like a Cow
...