2015-06-27 4 views
2

Я новичок в JS.с использованием создания прототипа в Javascript

Я экспериментировал в JSFiddle.

Я создал объект A, а затем создал два новых объекта B и C, как показано ниже.

debugger; 
var A = { 
    name:"h", 
    lastname:'n', 
    address:'B' 
}; 
A.getname = function() 
{ 
    console.log(this.name); 
}; 
var B = Object.create(A); 
var C=new Object(); 
C.prototype = A; 
console.log(B.lastname); 
console.log(C.lastname); 
A.getname(); 
B.getname(); 
C.getname(); 

Я принял концепцию создания нового объекта с уже существующего объекта с использованием Object.create (старый объект) из JavaScript: хорошая книга частей и концепции наследования объекта от http://www.codecademy.com/courses/objects-ii/3/3?curriculum_id=506324b3a7dffd00020bf661.

После отладки, Но значение value console.log (C.lastname) не определено, а C.getname() дает мне ошибку.

TypeError: C.getname is not a function 

Почему это бросает мне ошибку и в чем преимущества использования Object.create() в этом случае.

+0

Возможно преимущество использования 'Object.create' является то, что он делает работу, в то время как ваш' .prototype' код не? – Bergi

+0

Но я думаю, что ответ, который вы действительно ищете, состоит в том, что 'Object.create' - это то, что вы используете для наследования существующего объекта, а' function C() {}; C.prototype = A; 'и' var c = new C(); c.lastname; c.getname() 'имеет преимущество выполнения кода для инициализации экземпляров. – Bergi

+0

@Bergi Я считаю, что проблема (среди прочего) здесь «C.prototype = A», прототип, который он ссылается, не тот, который ему нужен. 'C.constructor.prototype' - это тот, который он ищет. (что я не рекомендую) –

ответ

2

Если вы хотите использовать .prototype для наследования, вам нужно будет A и C быть классами (а не только объектами).

var A = function() { 
    this.name = 'h'; 
    this.lastname = 'n'; 
    this.address = 'B'; 
} 
A.prototype.getname = function() { 
    console.log(this.name); 
}; 
var a = new A(); 
console.log(a.getname()); // h 

var C = function() {}; 
C.prototype = new A(); 
var c = new C(); 
console.log(c.lastname); // n 
console.log(c.getname()); // h 

Заметное преимущество использования Object.create над Object.prototype для наследования (как можно увидеть здесь), что с Object.create вы можете использовать простые объекты (а не классы).

Чтобы лучше понять преимущества использования Object.create см @ принятый ответ FelixKling на более similar question ...

+0

Напротив, заметное преимущество использования конструкторов + '.prototype' над' Object.create' заключается в том, что они предоставляют средства для инициализации всех экземпляров при создании. – Bergi

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