2016-08-26 2 views

ответ

0

Так как вы определили свой метод get для возврата. Какое бы значение вы не имели в функции get return - это значение, которое оно разрешает.

См:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty(Test.prototype, 'time', { 
    configurable: true, 
    get: function() { return 'A new value!'; } 
}); 

var a = new Test(); 

console.log(a.time); //A new value! 

Если вам интересно, почему console.log выводит новое значение, в отличие от той, первоначально определенной, хорошо, это потому, что вы установили Object.defineProperty перенастроить Test.prototype.time чтобы быть новым значением, которое сделало новый экземпляр его также новым значением.

Вы можете проверить это сами:

function Test(){ 
    this.time='pat'; 
} 

// This instance will have the old values 
var b = new Test(); 

// Change value returned by Test.time by new Test instances 
Object.defineProperty(Test.prototype, 'time', { 
    configurable: true, 
    get: function() { return 'A new value!'; } 
}); 

var a = new Test(); 

console.log(a.time); // A new value! 
consoel.log(b.time); // pat 

Когда вы инстанцирован b вы дали вы сделали экземпляр с исходными определениями. Тем не менее, когда вы создали сайт a, вы сделали экземпляр с новыми определениями time, поэтому он отличается.

+2

Я думаю, что ОП хочет знать, почему значение на самом объекте не было возвращено первым перед проверкой прототипа. – alex

+0

Думаю, ты прав. Спасибо alex! – Mike

2

С time не является простейшим свойством, а присвоение ему использует определение свойства на прототипе. Так как свойство прототипа определено с помощью геттера, но не setter, ему нельзя назначить. Если бы вы были в строгом режиме (как правило, хорошая идея), вы получили бы об этом ошибку.

Конструктор может создать «собственный» time объект на экземпляре, просто не с простым назначением; он должен использовать defineProperty, чтобы сделать это:

function Test(){ 
 
    Object.defineProperty(this, "time", { 
 
    writable: true, 
 
    enumerable: true, 
 
    configurable: true, 
 
    value: 'pat' 
 
    }); 
 
} 
 

 
Object.defineProperty(Test.prototype, 'time', { 
 
    configurable: true, 
 
    get: function() { return 'test'; } 
 
}); 
 

 
var a=new Test(); 
 
console.log(a.hasOwnProperty("time")); // true 
 
console.log(a.time); //pat 
 
a.time = "updated"; 
 
console.log(a.time); //updated