1

Я много читал о том, как работает прототипное наследование и как интерпретатор перемещает цепочку прототипов, чтобы найти свойство.Сколько раз родительский объект создавался во время прототипального наследования

function Man() 
{ 
    this.hands=2;//1 
} 
function father() 
{ 
    this.name=""; 
} 
father.prototype= new Man();//2 

var malay= new father(); 
var abhik= new father(); 

Теперь мой вопрос заключается в том, что оператор # 1 & # 2 вызывается только один раз. Итак, «абхик» и «малай» должны делиться одним и тем же объектом «Человек»? Итак, в памяти будет 3 объекта. 1.abhik 2.malay 3.man (Один экземпляр разделяет оба) Итак, по этой логике измененное значение должно делиться между объектами?

malay.hands=3; 
console.log(abhik.hands); 
abhik.hands=4; 
console.log(malay.hands); 

Но это не тот случай. Почему так?

+0

Для получения дополнительной информации о том, как подклассы: http://stackoverflow.com/questions/16063394/prototypical -inheritance-writing-up/16063711 # 16063711 Все, что задано для something.prototype, делится между экземплярами, если ваш экземпляр должен подклассировать Человека, чем в теле функции отца, чтобы вызвать человека в контексте созданного Отца так: Человек ,называть (это); – HMR

+0

В тот момент, когда вы настраиваете свойство руки на малайском языке, вы покрываете свойство, затененное от прототипа. (Sry для форматирования, для мобильных устройств) – C5H8NNaO4

ответ

2

Ваше понимание верно, что есть 3 объекта, и оба abhik и malay наследуют от того же Man экземпляра. Но когда вы устанавливаете новые объекты hands на объектах malay и abhik, вы даете им свои собственные hands собственности, и они больше не наследуют hands от прототипа Man.

Иллюстрация:

После первого создания malay и abhik, вот макет из трех ваших объектов:

father.prototype -> {hands: 2} 
malay -> {name: ""} // Empty name property, NO hands property 
abhik -> {name: ""} // Empty name property, NO hands property 

При регистрации для hands собственности на malay или abhik, переводчик увидит, что такого свойства нет и проверит цепочку прототипов и обнаружит, что их родительский father.prototype имеет свойство hands, поэтому интерпретатор wi ll сообщите об этом значении, которое равно 2.

Задав hands свойства, ваши объекты выглядят следующим образом:

father.prototype -> {hands: 2} 
malay -> {name: "", hands: 3} // Empty name property, OWN hands property 
abhik -> {name: "", hands: 4} // Empty name property, OWN hands property 

Теперь ваши объекты имеют свои собственные hands свойства.

Ресурс: Вот очень хорошо написано (но долго) статья о Javascript Наследования: http://manuel.kiessling.net/2012/03/23/object-orientation-and-inheritance-in-javascript-a-comprehensive-explanation/

+0

Любая ссылка, объясняющая это подробно? , Означает ли это, что каждый раз, когда я вызываю нового отца(), вызывается новый Man()? – Abhik

+0

@Abhik разместил ссылку в комментарии. И нет; Человек будет создан только один раз. – HMR

+0

Нет, конструктор Man создается только один раз. См. Мой обновленный ответ. – sh0ber

1

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

function Man() 
{ 
    var hands=2; 
    return { 
    getHands:function(){ 
     return hands; 
    }, 
    setHands:function(number){ 
     hands=number; 
    } 
    } 
} 
function Father(name) 
{ 
    this.name=name; 
} 
Father.prototype= Man(); 
malay=new Father("malay"); 
abhik=new Father("abhik"); 
malay.setHands(4); 
console.log(abhik.getHands()); 
console.log(malay.getHands()); 

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

function Hands(){ 
    var hands=2; 
    return { 
    get:function(){ 
     return hands; 
    }, 
    set:function(number){ 
     hands=number; 
    } 
    } 
} 

function Man(){ 
    this.age=18; 
    this.array=[]; 
} 
Man.prototype.hands=Hands(); 
function Father(name){ 
    //take ownership (copy) of every variable 
    //defined in the Man function body 
    //with this.... prototype defined 
    //are still shared among instances 
    Man.call(this); 
    this.name=name; 
} 
Father.prototype= new Man(); 


malay=new Father("malay"); 
abhik=new Father("abhik"); 
malay.hands.set(4); 
console.log(abhik.hands.get()); 
console.log(malay.hands.get()); 
malay.age=34; 
console.log(abhik.age);//from Man.age 
console.log(malay.age);//from malay.age 
delete malay.age; 
console.log(malay.age);//from Man.age 
malay.array.push(22); 
console.log(abhik.array);// is [] but would be [22] 
// if Man.call(this) was not in the Father function 
console.log(malay instanceof Man); 
+0

Я знаю реализацию. Я просто хотел узнать, почему и как. Все равно спасибо. – Abhik

+0

Почему объясняется в комментарии, который я дал 5 часов назад, и ответ sh0ber. Вы не можете напрямую назначить значение для свойства, определенного в прототипе экземпляра. Как ранее не объяснялось, как изменить значение свойства «руки» прототипа. – HMR