0

Я пытаюсь понять прототип Javascript. Я знаю, что могу добавить функции для прототипа отдельно Calculator.prototype.calculate = function(){};, однако, когда я попытался установить новый прототип, все развалилось. calc.prototype возвращает undefined. Мой вопрос: почему мы не можем установить новый объект в качестве прототипа? Как добавить методы к прототипу навалом, а не добавлять его по одному?Как установить прототип функции

var calc = new Calculator(); 

function Calculator(){ 
    this.array = []; 
    this.results = 0; 
} 

Calculator.prototype = { 

    calculate: function(){ 
     try{ 
     results = eval(this.array.join('')); 
     this.array = [results]; 
     return results; 
     } 
     catch(error){ 
      alert('Wrong arguments provided'); 
      return this.array.join(''); 
     } 
    }, 

    isNumber: function(str){ 
     return !isNaN(parseFloat(str)) && isFinite(str); 
    }, 

    addToOperationsArray: function(str){ 
     if (this.array.length <= 0 && !this.isNumber(str)){ // Don't add operand before any number. 
      return; 
     } 

     this.array.push(str); 

    }, 
    clearEverything: function(){ 
     this.array = []; 
    } 
}; 
+0

Вы не можете установить новый объект в качестве прототипа, потому что существующий прототип - это больше, чем просто пустой объект. Он включает, например, очень необходимую конструкторскую функцию. Вам нужно _extend_ существующий прототип; есть много способов сделать это, одним из которых является использование нового [Object.assign] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) метод – Hamms

+0

Как все развалилось? вы проверили «calc .__ proto__», вы обнаружите, что он есть. Очевидно, вы не использовали бы это - но он должен показать вам, что он на самом деле есть. –

+0

Да, он все еще указывает на Calculator.prototype, который является объектом со свойством конструктора, который имеет прототип, который содержит все эти методы, но бесполезен, потому что я не могу их назвать. Это добавляет больше к путанице, потому что ранее я, хотя цепь прервана, но теперь я вижу, что эти функции находятся в прототипе, который находится где-то в этой черной дыре, которую мы называем javascript. –

ответ

1

Скорее всего, вы пытаетесь получить доступ к объекту (новому) прототипа до его назначения. Вы можете использовать конструктор Calculator, потому что объявления функций подчиняются hoisting. Назначений нет.

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

// use the default prototype 
var test1 = new Test(); 

// a new prototype is assigned 
// objects created from this point will use it 
Test.prototype = { 
    report: function(){ alert('jah live children yea'); } 
}; 
var test2 = new Test(); 

test1.report();  // Uncaught TypeError: test1.report is not a function 
test2.report();  // alerts 


function Test(){} // hoisted so you can use it before this line 

Обратите внимание, что вы можете использовать свойство прототипа с объектом, который был создан до них добавляются к прототипу, если сам объект-прототип не был изменен, но только расширен.

Важно только, чтобы вы не вызывали вызовы перед назначением функций.

var test1 = new Test(); 

test1.report();  // Uncaught TypeError: test1.report is not a function 

// extend the prototype object 
// the added property is accessible by existing objects 
Test.prototype.report = function(){ 
    alert('jah live children yea'); 
}; 

test1.report();  // alerts 


function Test(){} 
+1

Вот. Вы решили тайну. –

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