2012-06-07 3 views
3

Я понимаю, что «__proto__ является внутренним свойством объекта, указывая на его прототип», поэтому в следующем примере я бы подумал, что c2.prototype будет равен c2.__proto__. Почему у них нет такой же ценности?Почему в этом примере нет .__ proto__ = .prototype?

<!DOCTYPE html> 
<html> 
    <head> 
     <script type="text/javascript"> 
      window.onload = function() { 
       var Circle = function(radius) { 
        this.radius = radius; 
        this.doubleRadius = function() { 
         return this.radius * 2; 
        } 
       } 

       var c1 = new Circle(4); 

       Circle.prototype.area = function() { 
        return Math.PI*this.radius*this.radius; 
       } 

       var c2 = new Circle(5); 

       console.log('--- first circle object, created before adding "area" method'); 
       console.log(c1.radius); 
       console.log(c1.doubleRadius()); 
       console.log(c1.area()); 

       console.log('--- second circle object, created after adding "area" method'); 
       console.log(c2.radius); 
       console.log(c2.doubleRadius()); 
       console.log(c2.area()); 

       console.log(c2.prototype); // undefined 
       console.log(c2.__proto__); // Object { area=function() } 

      } 
     </script> 
    </head> 
<body> 
</body> 
</html> 

ответ

1

Попробуйте нижеследующее.

console.log(c2.constructor.prototype); 
console.log(c2.__proto__); 

Acturly, .__proto__ == .constructor.prototype когда c2 является объектом.

+1

Посмотрите мои комментарии на ответ Инженера для случая, когда это неверно. http://jsfiddle.net/mendesjuan/UrqmL/ –

2

obj.__proto__ короткая версия obj.constructor.prototype, не obj.prototype:

console.log(c2.constructor.prototype === c2.__proto__); //true 
console.log(c2.prototype === c2.__proto__); //false 
+1

Это не совсем короткая версия. Вы можете изменить прототип одного экземпляра объекта и не повлиять на других. Верно, что обе версии указывают на один и тот же объект (если вы не изменили его). –

+0

@JuanMendes Что означает «изменение прототипа одного экземпляра»? И PLS, покажите мне пример, где 'c2.constructor.prototype! = C2 .__ proto__'. – Engineer

+0

В моем комментарии говорится, что если вы не изменили его, я подумал, что это кажется очевидным. Здесь http://jsfiddle.net/mendesjuan/UrqmL/ Я создал два экземпляра из одного и того же конструктора, изменив свойство '__proto__' одного из них. Для того, что было изменено, 'console.log (a.constructor.prototype == a .__ proto __);' выводит false –

3

Простой ответ заключается в том, что c2.constructor.prototype == c2.__proto__

Конструкторы имеют .prototype свойство. Экземпляры нет, но у них есть .__proto__ и .constructor свойства

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