концепция прототипного наследования в javascript как языке, основанном на прототипе

вы знаете, что Javascript-это язык программирования на основе прототипов .
Я прочитал несколько книг о Javascript и его прототипного наследования концепция, но:

6 ответов


классическое наследование о расширении типов вещей. Скажем у вас есть класс, как Bike. Когда вы хотите расширить поведение, вы должны разработать новый тип велосипеда (например,MotorBike).

прототип на основе наследования о расширяя вещи сами. Скажите, что у вас есть способ сделать Bike объекты. Возьмите один из этих Bikes в вашем гараже, и вы привязываете к нему реактивный двигатель.

это не соответствует плану. Это то, что вы сделали с этим конкретным велосипедом. Но твои друзья видят твое изобретение и тоже хотят его. Поэтому вместо того, чтобы сделать чертеж для вашего нового дизайна, вы вешаете табличку с надписью "JetBike factory " и просто начните делать больше из них. И каждый раз ты не можешь. помните, как что-то сочетается, вместо того, чтобы смотреть на чертеж, вы просто смотрите на свой оригинальный велосипед. Ваш оригинальный велосипед прототип велосипед, и все новые мотоциклы на его основе.

теперь, для подлинного 6-летнего, Это, вероятно, где я бы остановился (если бы я их уже не потерял), но на самом деле прототипное наследование не просто создает копии, оно делает что-то еще круче - оно фактически связывает новое JetBike объекты исходного прототипа велосипед у вас в гараже. Если вы замените подвеску на своем прототипе велосипеда, то велосипеды всех ваших друзей также волшебным образом заменят свою подвеску.

давайте посмотрим на некоторый псевдо-код JS-ish:

function Bike() {
    this.wheels = 2;
}
Bike.prototype = {
    ride: function() {
        // Ride the bike
    },
    crash: function() {
        // Fall off the bike
    }
};

function JetBike() {
    this.engines = 2;
}
// Start with an ordinary bike
JetBike.prototype = new Bike();
// Modify it
JetBike.prototype.fly = function () {
    // Engage thrusters and head for the ramp
};

Javascript-объектно-ориентированный язык, уникальный тем, что он не имеет классов. Вместо этого мы используем функции для создания объектов.

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

Так что если у меня есть функция, которая создает объект:

function Foo() {

}
Foo.prototype.someProperty = 'blahblahblah';

вы можете создать другую функцию, которая создает объект, и позволить ей наследовать свойства и методы объектов, установив прототип функций для этого объекта.

function Bar() {

}
Bar.prototype = new Foo();

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

var bar = new Bar();
alert( bar.someProperty ); // blahblahblah

в отличие от большинства других объектно-ориентированных языков, JavaScript фактически не имеет концепции классов. В большинстве других объектно-ориентированных языков вы бы создали экземпляр определенного класса, но это не так в JavaScript.
в JavaScript объекты могут создавать новые объекты, а объекты могут наследовать от других объектов.
Вся эта концепция называется прототипного наследования.

но как мы можем сделать объект?
Просто вы можете создать общий объект с помощью {}.

var a = {};
a.prop = "myprop";
console.log(a); //Object { prop="myprop" }

вы не можете создать экземпляр a потому что это не функция. другими словами, он не имеет специального внутреннего метода [[Construct]].

в JavaScript любая функция также может быть создана как объект. Функция ниже-это простая функция, которая принимает имя и сохраняет его в текущем контексте:

function User( name ) {
   this.name = name;
}

мы видим, что User это экземпляр Функция:

alert(User instanceof Function); //true

создайте новый экземпляр этой функции с указанным именем:

var me = new User( "My Name" ); 

мы видим, что его name было установлено как свойство само по себе:

alert( me.name == "My Name" ); //true

и что это экземпляр


интересные задачи :-)

прежде всего, я бы никогда не попытался объяснить это кому-либо, просто используя слова, но я попробую: -)

"прототипное наследование похоже на покемона, который может украсть силы у других покемонов."

думаю, что вы могли бы создать свой собственный покемон. Вы можете решить, насколько он большой,какого цвета и т. д. (конструктор.) Тогда вы можете дать, что pokemon полномочия (прототипы). Вы можете породить столько этих покемонов, сколько захотите. Прототипное наследование дает вам возможность позволить одному, нескольким или всем этим покемонам украсть силы у других покемонов. Вы даже можете украсть полномочия у покемонов, которые уже украли полномочия у другого покемона. Это создает совершенно новый диапазон супермощных покемонов.

может быть, немного глупо, но это отражает, насколько мощное прототипное наследование... в Покемон смысле: -)


прототипное наследование - это как сын, несущий своего отца на спине, куда бы он ни пошел. Если кто-то спросит сына: "какого цвета твои туфли?- Он бы ответил цветом своих ботинок, если только он не босиком,тогда он ответил бы цветом своих отцов.


/* Here is simple way how to inherit objects properties and methods from others object by using prototyping inheritance in plain java script.*/
(function() {  
      // get dom elements for display output`enter code here
      var engTeacherPara = document.getElementById("engTeacher");
      var chemTeacherPara = document.getElementById("chemTeacher");
      // base class 
      var SchoolStaff = function(name, id) {
          this.name = name;
          this.id = id;
        }
        // method on the SchoolStaff object
      SchoolStaff.prototype.print = function() {
        return "Name : " + this.name + " Employee id: " + this.id;
      }

      SchoolStaff.prototype.sayHello = function() {
        return "Hello Mr : " + this.name;
      }

      // sub class engTeacher
      var EngTeacher = function(name, id, salary) {
          SchoolStaff.call(this, name, id);
          this.salary = salary;
        }
        // Inherit the SchoolStaff prototype
      EngTeacher.prototype = Object.create(SchoolStaff.prototype);

      // Set the engTeacher constructor to engTeacher object
      EngTeacher.prototype.constructor = EngTeacher;

      // method on engTeacher object
      EngTeacher.prototype.print = function() {
        return "Name : " + this.name + " Salary : " + this.salary + " Employee id: " + this.id;
      }

      // sub class chemTeacher
      var ChemTeacher = function(name, id, salary, bonus) {
          EngTeacher.call(this, name, id, salary);
          this.bonus = bonus;
        }
        // Inherit the SchoolStaff prototype
      ChemTeacher.prototype = Object.create(EngTeacher.prototype);

      // Set the engTeacher constructor to engTeacher object
      ChemTeacher.prototype.constructor = ChemTeacher;

      // method on engTeacher object
      ChemTeacher.prototype.print = function() {
        console.log("Name : " + this.name + " Salary : " + this.salary + " Employee id: " + this.id + " bonus : " + this.bonus);
      }

      // create new objcts and check sub class have base class methods access
      var schoolStaff = new SchoolStaff("Base Class", 100);
      console.log(schoolStaff.sayHello()); // Hello Mr : Base Class

      var engTeacher = new EngTeacher("Eng Teacher", 1001, 20000);
      engTeacherPara.innerHTML = engTeacher.sayHello(); // Hello Mr : Eng Teacher  

      var chemTeacher = new ChemTeacher("Chem Teacher", 1001, 30000, 4000);
      chemTeacherPara.innerHTML = chemTeacher.sayHello(); // Hello Mr : Chem Teacher
    })();