2016-07-21 4 views
3

Я пытаюсь понять разницу между доступом к переменной через prototype и доступом к ней через this. В одном объекте создается отдельная копия x для this.x и одна для *.prototype.x. Но в другом, выглядит как обе точки к одной и той же копии.Доступ к одной и той же переменной прототипа 'x' через this.x создает отдельную копию?

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Testing Promises</title> 
 
</head> 
 

 
<body> 
 

 
<button type="button" onclick="test()"> Click Me</button> 
 

 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 
<script> 
 

 
    function Estimate() { 
 
    } 
 
    Estimate.prototype.sharedVar = 888; 
 

 

 
    Estimate.prototype.print = function() { 
 
     console.log("****************************************************"); 
 
     console.log("*  Shared Variable    : ", this.sharedVar); 
 
     console.log("*  Estimate Shared Variable : ", Estimate.prototype.sharedVar); 
 
     console.log("****************************************************"); 
 
    } 
 

 
    Estimate.prototype.update = function (value) { 
 
     this.sharedVar = value + 100; 
 
     Estimate.prototype.sharedVar = value + 300; 
 
    } 
 

 
    function test() { 
 
     var o1 = new Estimate(); 
 
     var o2 = new Estimate(); 
 
     o1.print(); 
 
     o2.print(); 
 

 
     o1.update(555); 
 

 
     o1.print(); 
 
     o2.print(); 
 

 
    } 
 

 

 
</script> 
 

 
</body> 
 

 
</html>

Почему печать 655, 855 в o1, тогда как 855, 855 в o2?

ответ

2

При добавлении свойства прототипа, он влияет на все объекты с этим прототипом. Когда вы используете ключевое слово this, оно влияет только на этот экземпляр.

2 утверждения в приведенной ниже функции не эквивалентны. Они меняют две отдельные переменные. Когда вы впервые инициализировали свои объекты, у них не было свойств, поэтому интерпретатор будет искать, имеет ли прототип это свойство. Когда вы вызвали обновление, он добавил новое свойство в ваш экземпляр. Когда вы первый раз пытаетесь найти this.sharedVar, у этого экземпляра его нет, поэтому он будет искать прототип для общего var, и если он его не найдет, он будет продолжать разделяться на ObjectVist.

В изображениях до и после изображения вы можете видеть, что происходит.

enter image description here

enter image description here

0

На самом деле X.prototype.Y полезно, когда вы хотите добавить же свойство (здесь Y) к каждому экземпляру X Если вы хотите общее значение между этим элементом Тогда вы можете легко добавить свойство X себя или вы можете создать глобальную переменную к которым каждая вещь имеет доступ к этой ценности.

Но если вы хотите, чтобы сделать его полностью скрыты из X объектов сферы, то вы можете попробовать это:

var X = (function _X() { 
 
    _X.SharedValue = 3; 
 
    var myFunc = function() { 
 
    _X.SharedValue++; 
 
    }; 
 

 
    myFunc.prototype.getShared =() => _X.SharedValue; 
 
    return myFunc; 
 
}()); 
 

 
console.log(new X().getShared(), new X().getShared(), new X().getShared());