gpt4 book ai didi

javascript - 为什么我的原型(prototype)不执行?

转载 作者:搜寻专家 更新时间:2023-10-31 08:51:43 24 4
gpt4 key购买 nike

我希望 Success!Oops! 横幅在 goingOutChecker() 原型(prototype)正常工作时出现在浏览器顶部 & 我在 GeneralChecker() 函数中调用 goingOutChecker() 原型(prototype)。但是,每当我注释掉 goingOutChecker() 原型(prototype)和函数调用时,monthlyBillCheckerAndSalaryChecker() 原型(prototype)及其调用都能完美运行。换句话说,Success!Oops! 横幅都会在用户点击 Submit 时显示,前提是前两个字段已填写正确或不正确。

我的问题是,为什么当我在 GeneralChecker() 中调用 goingOutChecker() 原型(prototype)时,goingOutChecker() 原型(prototype)无法正常工作功能?换句话说,无论3个字段都填写正确或不正确,为什么那些横幅不会出现?

此外,我在控制台中没有收到任何错误,只是作为旁注。

这是gameTime.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>WOMP</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="gameTime.css">
</head>
<body>
<div class="container">
<div id="success"></div>
<div id="danger"></div>
<div id="success2"></div>
<div id="danger2"></div>
</div>
<form class="col-md-4 col-md-offset-4" name="formHandler" id="handle">
<div id="allFields">
<div class="moveUsername">
<h1>(All numbers inputted will be assumed that it's in dollars)</h1>
<label for="usr">What's your annual salary?</label>
<input type="field" class="form-control" id="salary" placeholder="What's your annual salary?" required="required">
</div>

<div class="ageMovement">
<label for="usr">How much do you spend every month on bills?</label>
<input type="field" class="form-control" id="monthlyBills" name="ageChecker" placeholder="How much do you spend every month on bills?" required="required">
</div>

<div class="emailMovement">
<label for="usr">How much do you spend when going out?</label>
<input type="field" class="form-control" id="goingOut" name="emailChecker" placeholder="How much do you spend when going out?" required="required">
</div>
<button type="submit" id="btnSubmit" class="btn btn-default" onsubmit="GeneralChecker()">Submit</button>
</form>
<script type="text/javascript" src="gameTime.js"></script>
</body>
</html>

这是 gameTime.js 文件

function GeneralChecker(salary, fixedExpense, variableExpense) {
var self = this;
self.salary = salary;
self.fixedExpense = fixedExpense;
self.variableExpense = variableExpense;
self.isSalaryZeroOrLess = function() {
var s = parseInt(document.getElementById("salary").value);
console.log(this);
if(s <= 0) {
console.log("Looks like you have no income!");
} else {
console.log("Your annual salary is: ", s);
}
self.monthlyBillCheckerAndSalaryChecker();
self.goingOutChecker();
}
}

GeneralChecker.prototype.monthlyBillCheckerAndSalaryChecker = function() {
var m = parseInt(document.getElementById("monthlyBills").value);
var firstDiv = document.getElementsByTagName("div");
var secondDiv = document.getElementsByTagName("div");
var node = document.getElementById("danger");
var node2 = document.getElementById("success");

if(m <= 0 || isNaN(m)) {
console.log("Looks like you have no monthly payments to make!");
secondDiv[2].innerHTML = "<strong>Oops!</strong> Looks like you have an invalid input.";
node.className += " alert alert-danger";
} else {
firstDiv[1].innerHTML = "<strong>Success!</strong> Check for advice below.";
node2.className += " alert alert-success";
}

var s = parseInt(document.getElementById("salary").value);
var userMonthlySalary = s / 12;
console.log(userMonthlySalary);

if(userMonthlySalary) {
console.log("That means you make " + userMonthlySalary + " a month.");
}
}

GeneralChecker.prototype.goingOutChecker = function() {
var m = parseInt(document.getElementById("goingOut").value);
var firstDiv = document.getElementsByTagName("div");
var secondDiv = document.getElementsByTagName("div");
var node = document.getElementById("danger2");
var node2 = document.getElementById("success2");

if(m <= 0 || isNaN(m)) {
console.log("You don't go out much");
secondDiv[4].innerHTML = "<strong>Oops!</strong> Looks like you have an invalid input.";
node.className += " alert alert-danger";
} else {
firstDiv[3].innerHTML = "<strong>Success!</strong> Check for advice below.";
node2.className += " alert alert-success";
}
}

var fin = new GeneralChecker(1000, 1000, 1000);
document.querySelector("#btnSubmit").addEventListener("click", fin.isSalaryZeroOrLess);

最佳答案

绑定(bind)事件处理程序时,您将丢失对象上下文。你可以这样做:

document.querySelector("#btnSubmit").addEventListener("click", function() {
fin.isSalaryZeroOrLess();
});

或者像这样:

document.querySelector("#btnSubmit").addEventListener("click", fin.isSalaryZeroOrLess.bind(fin));

this 的值不取决于函数是如何针对某个对象创建的,而是取决于函数是如何被调用的。通过像在原始代码中那样传递对函数的引用,与 fin 对象的关系将丢失。

关于javascript - 为什么我的原型(prototype)不执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41398690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com