如何设置函数的原型

时间:2016-07-29 17:20:49

标签: javascript prototype javascript-objects javascript-inheritance

我正在尝试理解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 = [];
    }
};

1 个答案:

答案 0 :(得分: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(){}