Почему этот код JavaScript не работает? - PullRequest
0 голосов
/ 31 января 2012

Этот код работает:

    function class1(){
        this.x5 = 5;
        this.x6 = 6;
        this.prototype = 5;
    }

    function class2(){
        this.x3 = 3;
        this.x4 = 4;
    }


    class2.prototype = new class1();
    var obj1 = new class2();
    alert(obj1.x5 ); // alert me 5 

Но почему это не работает:

     function class1(){
        this.x5 = 5;
        this.x6 = 6;
        this.prototype = 5;
     }

    function class2(){
        this.x3 = 3;
        this.x4 = 4;
        this.prototype = new class1();  // or class2.prototype = new class1(); 
     }

    var obj1 = new class2();
    alert(obj1.x5); // alert me "undefinded"

1 Ответ

5 голосов
/ 31 января 2012

Вы не можете установить прототип внутри функции таким образом. При вызове функции с оператором new создается новый объект, и этому объекту устанавливается this. У объектов нет общедоступного свойства прототипа, которое вы можете установить. Их свойство prototype на самом деле __proto__, которое недоступно (хотя некоторые браузеры позволяют вам это сделать).

Во втором примере вы просто устанавливаете обычное ванильное свойство с именем «prototype» со значением.

свойство prototype для функции также не является прототипом! Смущает, а? Что это на самом деле является чем-то вроде «прототипа шаблона». В основном это означает, что «когда вы создаете объект, используя эту функцию в качестве конструктора, установите для его прототипа то, что я установил в свойстве prototype». Это может быть очень запутанным, пока вы не поймали это.

Также обратите внимание

Ваш первый пример тоже не работает ( попробуйте здесь ), вы устанавливаете свойство prototype функции после того, как экземпляр уже был создан. Так что этому экземпляру уже был присвоен другой объект-прототип. Если вы создали второй экземпляр class2, он правильно сообщит свойству.

...