2016-07-01 3 views
1

Я новичок с JavaScript, и я столкнулся с проблемой с функциями конструктора, моя проблема в том, что я не могу перезаписать свойство старой функции новым!Я не могу изменить свойство в функции-конструкторе

Ниже мой код:

function myFun() { 
 
    this.anotherFun = function() { 
 
    return true; 
 
    } 
 
} 
 

 
var myVar = new myFun(); 
 

 
console.log(myVar.anotherFun()); // returns 'true' as expected; 
 

 
myFun.prototype.anotherFun = function() { 
 
    return false; 
 
} 
 

 
console.log(myVar.anotherFun()); // is returns 'true' why not 'false'?

+1

'myFun.prototype.anotherFun ='> 'myFun.anotherFun =' – dandavis

+1

У вас есть две функции, собственное свойство и свойство прототипа. Собственные свойства, как указывает дандавис, сначала проверяются. – elclanrs

ответ

3

Потому что, когда же свойство несколько раз появляется в прототипе цепи, то имеет смысл использовать ближайший.

Ваш экземпляр имеет собственное свойство, поэтому вы не сможете его переопределить, добавив унаследованный.

Вы могли бы не хотел, чтобы добавить myFun как собственность

function myFun(){} 
 
myFun.prototype.anotherFun = function(){return true}; 
 
var myVar = new myFun(); 
 
console.log(myVar.anotherFun()); // true 
 
myFun.prototype.anotherFun = function(){return false}; 
 
console.log(myVar.anotherFun()); // false

+0

Спасибо, что работает для меня !, но почему бы нам не написать функцию myFun() {this.prototype.anotherFun = function() {return true};} вместо функции myFun() {} myFun.prototype.anotherFun = function() {return true}; –

+1

@ M.Taki_Eddine Потому что нет причин запускать этот код каждый раз, когда вы создаете экземпляр. Поэтому он должен быть вне конструктора. – Oriol

1

То, что вы пытаетесь сделать, не будет работать с вашим кодом в качестве собственных свойств всегда будет смотреться перед свойства прототипа, поэтому изменение, которое вы делаете на свойство прототипа, не будет иметь видимого эффекта. Для того, чтобы это работало, вы можете изменить свой код, чтобы всегда использовать свойство прототипа:

function myFun(){} 
 
myFun.prototype.anotherFun = function(){return true;} 
 
var myVar=new myFun(); 
 
console.log(myVar.anotherFun()); // returns 'true' as expected; 
 
myFun.prototype.anotherFun=function(){return false;} 
 
console.log(myVar.anotherFun()); // now returns 'false' as expected

Если вы хотите узнать больше об этой теме, проверить this Question.

+0

Спасибо, это работает для меня !, но почему бы нам не написать функцию myFun() {this.prototype.anotherFun = function() {return true};} вместо функции myFun() {} myFun.prototype.anotherFun = function() {return true}; - –

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