如何设置函数的原型
How to set a function's prototype
我正在尝试了解 Javascript 的原型。我知道我可以单独向原型添加功能 Calculator.prototype.calculate = function(){};
,但是当我尝试设置新原型时,一切都崩溃了。 calc.prototype returns 未定义。我的问题是为什么我们不能设置一个新的对象作为原型?如何将方法批量添加到原型而不是一个一个地添加?
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 = [];
}
};
您很可能在分配之前尝试访问(新)原型对象。您可以使用 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(){}
我正在尝试了解 Javascript 的原型。我知道我可以单独向原型添加功能 Calculator.prototype.calculate = function(){};
,但是当我尝试设置新原型时,一切都崩溃了。 calc.prototype returns 未定义。我的问题是为什么我们不能设置一个新的对象作为原型?如何将方法批量添加到原型而不是一个一个地添加?
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 = [];
}
};
您很可能在分配之前尝试访问(新)原型对象。您可以使用 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(){}