Ошибка прототипирования Javascript - PullRequest
0 голосов
/ 18 октября 2010

Я недавно изучал прототипирование Javascript, могу понять теорию и считаю, что она может быть очень полезна для моего понимания языка, но не может заставить работать следующее:

var player = function(){//Declarations here};
var super_player.prototype = new player();

Каждый компилятор / средство проверки помечает ошибку «отсутствует точка с запятой» в строке 2. Я в тупике, но верю, что я упускаю из виду нечто очень простое.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 6 ]

3 голосов
/ 18 октября 2010

Вы хотите сделать что-то вроде

function Player() {
    // player things here

}

Player.prototype = new SuperPlayer(); // get all the things on SuperPlayer prototype
Player.prototype.constructor = Player;

, предполагая, что SuperPlayer - это суперкласс Player, как бы.

edit - Если SuperPlayer - лучший игрок, то есть подклассПроигрыватель, просто измените вышеприведенный шаблон

function SuperPlayer() {
        // super player things here

    }

    SuperPlayer.prototype = new Player(); // get all the things on Player prototype
    SuperPlayer.prototype.constructor = SuperPlayer;  // the above line changed the     constructor; change it back

Я не могу сказать из того, что вы написали, является ли SuperPlayer подклассом или нет.Кроме того, в других ответах указывалось, что код, который вы опубликовали, синтаксически нарушен из-за комментария ...

2 голосов
/ 18 октября 2010

Ваш комментарий в строке 1 блокирует конечную скобку. Таким образом, у вас есть открытая скобка, которая не будет работать. Вы можете изменить его на следующее:

var player = function() {
   // Declarations here
};

Если бы я был вами, я думаю, что вы хотите рассмотреть возможность использования имен классов для верблюдов, выполнив следующие действия:

function SuperPlayer() {
}

function Player() {
}
Player.prototype = new SuperPlayer();
Player.prototype.constructor = SuperPlayer;

Это сделает SuperPlayer базовым классом, а Player - производным классом, поскольку Player наследует SuperPlayer от своего прототипа. Не наоборот, как в примере выше.

2 голосов
/ 18 октября 2010

Двигатель не знает, что super_player является function, пока вы не объявите его как единое целое, и, следовательно, у него нет prototype.

var player = function () {},
    super_player = function () {}

// now we can happily set the prototype :)
super_player.prototype = new player();

// don't forget to point the constructor back to super_player
// not doing so will cause great confusion
super_player.prototype.constructor = super_player
0 голосов
/ 19 октября 2010

Большое уважение к вам, Чаббард. :)

Ваш пример очень помог.

Мой оригинальный «пример» был довольно легкомысленным. : P

Хотя я все еще сталкиваюсь с несколькими проблемами ... Чтобы подробно остановиться на моем образце «кошка» (максимально кратко):

function mammal(){
// 'mammals' constructor - My 'empirical' 'class'...
} 
   mammal.count = 0; // To keep track of the zoo I've created. No subclass can access this property. It's a 'static' property

   // I could have declared this 'method' inside of my constructor
   // with an anonymous function attached to (this.prototype.breathe).

    mammal.track = function (){
        this.count++;
    }

    mammal.prototype.breathe = function(){
        alert("Inhale... Exhale...");
    }

function cat(){
// 'cat' constructor
}

// All cats shall now become a type of mammal
cat.prototype = new mammal();

cat.prototype = function(){
// This anonymous function is the REAL constructor for my 'cat' 'superclass'
}

    cat.prototype.meow = function(){
        alert("Meow!");
    }

function lion(){
// The king of jungle...
// I can keep track of the number of 'mammal' instances I create here
mammal.track();
}

// All lions are cats, afterall...
lion.prototype = new cat();
// Also note that I have no plans to extend the lion class.
// I have no need of a class below the 'idea' of a lion 

    lion.name = "Kitty"; // :}

    // Here's where I get confused...
    // I can set (lion.name) via instances, can't call (lion.pounce), but (lion.prototype.roar) works all day long! o_0
    lion.pounce = function(){
        alert(this.name+" pounces...")
    }

    lion.prototype.roar = function(){
        alert(this.name+" doesn't meow, he ROOOAAARS!"); 
    }

// With these constructs in place, I can now script...
$(document).ready(function(){

      var rory = new lion();    
      var napoleon = new lion();

      alert("We have "+mammal.count+" mammals running about");

          // This is 'Rory'...
          rory.name = 'Rory'; // Respect the pun...
          rory.roar();

          // This is 'Napoleon'...
          napoleon.name = 'Napoleon';
          napoleon.breathe(); // Napoleon can't breathe... he didn't inherit mammal.prototype.breathe(), for some reason
          napoleon.roar(); // How am I able to set (lion.name), but not call lion.pounce()?
          napoleon.pounce();

});

Вы, конечно, были правы, каждый класс в моей цепочке вплоть до создания конечного (ых) экземпляра (ов) является функцией-прототипом. Но почему (lion.name) работает, а не (lion.prototype.name). И наоборот, почему lion.prototype.pounce () может работать, когда lion.pounce () не работает?

Наполеон и Рори, в конце концов, оба Львы ...

У меня много вопросов по Javascript ... Это очень странный язык ...;)

0 голосов
/ 18 октября 2010

еще раз просматривал ответ Чаббарда ... Ключевое слово prototype лучше всего описать как громоздкое ... Это странно, потому что это, безусловно, ООП, но реализация безумная!

Взять общий пример ...

mammal() = object;
cat() = prototype; // Implements mammal();
tiger() = object; // Implements cat(), but does NOT require the 'prototype' keyword... like some kind of 'cystalline' form? I can then create a whole range of individual 'tigers', but will not be able to add any new properties to any of them...

Как насчет этого?

machine() = object;
car() = prototype; // Implements machine. It's a machine afterall...
super_car = prototype; // It's a very fast car...
ferrari = prototype; // They only make supercars...
ferrari_355 = object; // One of the best cars they've ever made. No need to change it, right? :}

Верно? : |

0 голосов
/ 18 октября 2010

Вы хотели сказать

super_player.prototype.player = function(){ /*Declarations here*/ };

...