2014-12-01 3 views
2

Почему прототип propertyinstance метательный undefined?.Свойства прототипа метания undefined

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

Test.prototype = { 
    constructor: Test, 
    sayHello : function(){ 
     console.log(this.name); 
    } 
} 

var z = new Test("Hello"); 


console.log(z.prototype); //undefined 
console.log(zUtils.constructor); // Test 

Я могу получить доступ к методу SayHello через z.sayHello(), то почему мой instanceprototype возвращение мне неопределенный вместо Test.prototype?.

+3

Потому что вы не можете получить прототип объекта, как это, нет такого свойства, потому что прототип не подвергается, как недвижимость. Вы можете получить его с помощью метода Object.getPrototypeOf. Например: 'Object.getPrototypeOf (z) === Test.prototype'. – dfsq

+1

@dfsq Вы не должны отвечать в комментариях. –

ответ

3

Проблема путаницы заключается в том, что слово prototype имеет два значения.

1. Функциональное свойство. Любая функция может иметь свойство prototype, которое является объектом. В вашем случае

Test.prototype = { 
    sayHello: function() {} 
} 

Свойство этого объект становятся наследственными свойствами и методами объектов, построенных с помощью этого конструктора функции:

var z = new Test(); 

Теперь z имеет свойство метода sayHello, который вы настроили с помощью объект Test.prototype.

2. Экземпляр экземпляра. Объект экземпляра, в вашем случае z, имеет внутренний ссылка на прототип объекта из пункта № 1 выше. Эта ссылка используется внутренне для разрешения свойств и методов в цепочке прототипов. Однако эта ссылка не является, предположительно доступной напрямую, и вы не можете получить доступ к этой ссылке с помощью свойства prototype объекта.

В chrome и Firefox вы можете использовать свойство __proto__, но его использование устарело.

Чтобы получить прототип, который был использован при строительстве объекта следует использовать Object.getPrototypeOf:

Object.getPrototypeOf(z) === Test.prototype; // true 
2

Чтобы получить прототип, используйте Object.getPrototypeOf(). Таким образом, в вашем примере, попробуйте с Object.getPrototypeOf(z)

0

вы должны использовать метод getPrototypeOf на object.like это:

Object.getPrototypeOf(z); 

вы можете сделать так:

Test.prototype=Object.getPrototypeOf(z); 
    console.log(Test.prototype); 
    console.log(Object.getPrototypeOf(z)); 
Смежные вопросы