2015-01-18 2 views
3

Я знаю, что уже есть вопрос, но я должен сделать это ясно.Как прототип работает в javascript?

function Animal(species) { 
    this.species = species; 
} 
Animal.prototype.getSpecies = function() { 
    return "Animal is " + this.species; 
}; 


(function() { 
    var animal1 = new Animal("Snake"); 
    var animal2 = new Animal("Wolf"); 
    var animal3 = new Animal("Tiger"); 
}()); 

И так я понимаю. enter image description here

Функция/метод getSpecies() совместно используется всеми объектами Animal в объекте прототипа. Правильно ли я понял?

Можно ли сказать, что _Proto_ является указателем на прототип объекта?

Спасибо за помощь.

+4

Да , ---------------- – JLRishe

ответ

6

Да, вы правы, вот как это работает! Но__proto__ не является указателем, это ссылка, и ее использование лишено. В Javascript реальных указателей не существует, но ссылки делают.

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

function FastAnimal() { 
    Animal.call(this, 'extreme-fast'); 
} 

FastAnimal.prototype = Object.create(Animal.prototype); 
FastAnimal.prototype.constructor = FastAnimal; 
FastAnimal.prototype.getSpeed = function() { return '1MILLION'; }; 


var fa = new FastAnimal(); 


fa.getName = function() {} 

Чем с поиском для свойства или методы в fa будет идти по этому пути:

  1. делает fa имеет эту СОБСТВЕННУЮ недвижимость (как getName)
  2. Это действительно есть в FastAnimal.prototype (getSpeed)
  3. оно существует в Animal

В целом: Этот поиск продолжается до тех пор, пока в пути prototype s. Однако именно это происходит под капотом и называется цепью прототипов.

NB:

Если вы хотите, чтобы цикл по свойствам данного объекта, есть два способа:

for (var prop in obj) { 
    //do stuff 
} 

Это включает в себя свойства прототипа и, как правило, не то, что люди хотят, это почему

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     //do stuff 
    } 
} 

является общей картины, НО есть новый тип цикла идет вверх и мы надеемся использовать в ближайшее будущее.

for (var prop of obj) {} 

Это также явно исключает свойства прототипа объекта.

+0

Что такое точка линии: FastAnimal.prototype.constructor = FastAnimal; ? – Raskolnikov

+1

Это своего рода исправление ... Object.create (...) копирует все свойства из прототипа Animals в FastAnimals один и включает конструктор, поэтому вам нужно его исправить. – philipp

+0

'for (var prop of obj) {}' is * ES6 * и, например, не поддерживается в Internet Explorer. MDN отмечает это как * экспериментальная технология *. Не использовать в производстве. Как вы уже сказали, – Mouser

0

Да, вы правы Если вы используете animal1.getSpecies == animal2.getSpecies истинные

anima2.getSpecies == animal3.getSpecies истинные

только одна копия функции и прототипа существует

Смежные вопросы