Наследование с Javascript?как получить «супер» или «базу» - PullRequest
2 голосов
/ 26 марта 2012

У меня есть следующий код:

function Person(){
    this.age = 30;
}

function Stats(){
    this.age = 20
}

Stats.prototype = new Person();

var fred = new Person();


console.log(fred.age)

Что я пытаюсь сделать, это понять наследование в Javascript, как я могу сделать выше и получить свойство age как в stats, так и в person?

Ответы [ 6 ]

1 голос
/ 26 марта 2012

Вы не можете. JavaScript не выполняет классическое наследование, а скорее прототипное наследование. Взгляните на статью Крокфорда об этом (и многих других.)

Поскольку person является прототипом для stats, все, что является частью прототипа person, будет переопределено путем установки этого атрибута в созданном объекте.

Но самое интересное в том, что если вы измените прототип, все объекты, у которых этот объект является прототипом, получат это изменение.

Есть некоторые проекты, которые пытаются включить классическое наследование в JavaScript, но вместо того, чтобы работать против него, вы должны научиться принимать его.

0 голосов
/ 26 марта 2012

Вы также можете использовать Object.getPrototypeOf (obj), как описано в этом ответе .Но я должен был изменить ваш код, чтобы сделать это.Я думаю, что вы хотели создать экземпляр объекта Stats, а не его родителя.Это было ваше намерение?

function Person(){
    this.age = 30;
}

function Stats(){
    this.age = 20
}

Stats.prototype = new Person();

// Note that this is not your code example
var fred = new Stats();

console.log(fred.age)


console.log(Object.getPrototypeOf(fred).age);
0 голосов
/ 26 марта 2012

JavaScript достаточно хорош, чтобы позволить вам достичь того, что вы хотите.Ваш вариант использования требует, чтобы все конструкторы вызывались при создании нового типа.Рассмотрим следующее:

function defineClass(ctor, baseType) {

   function classFunction() {
       if (baseType) {
         baseType.apply(this);
       };
       ctor.apply(this);
   }

  if (baseType) {
     ctor.prototype = Object.create(baseType.prototype);
     ctor.prototype.constructor = ctor;
  }
     classFunction.prototype = Object.create(ctor.prototype);

     return classFunction;
 }

Теперь вы можете определить два типа:

function fruit() { console.log("fruit ctor"); }

var apple = defineClass(function apple() { console.log("apple ctor"); }, fruit);

Создать новое яблоко:

new apple;

Консоль:

= фруктовый орех

= яблочный орех

0 голосов
/ 26 марта 2012

Javascript поддерживает как классическое, так и прототипное наследование.Большинство других языков поддерживают только классическое наследование.

var person1 = {"fname" : "Amit", "lname":"Agar"};
var SubPerson = function(){};
SubPerson.prototype = person1;
var person2 = new SubPerson();

Ссылка JavaScript хорошие части

0 голосов
/ 26 марта 2012

посмотрите на "Введение в объектно-ориентированный JavaScript" в MDN: https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript

0 голосов
/ 26 марта 2012

На самом деле из-за того, что у javascript нет классической объектной модели, вы не можете получить родительский объект ...

PS В вашем примере «родительский класс» - это Person, поэтому при создании нового персонажа parent будет объектом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...