Jquery 我的对象没有方法?
我很难理解为什么这个代码不起作用。据我所知,我的语法是正确的,但是console.log抱怨我的person对象没有方法setFirstName。以下是到目前为止我得到的信息: HTML 控制台日志显示此错误,并指向“person.setFirstName(firstName)”代码行:Jquery 我的对象没有方法?,jquery,oop,console.log,Jquery,Oop,Console.log,我很难理解为什么这个代码不起作用。据我所知,我的语法是正确的,但是console.log抱怨我的person对象没有方法setFirstName。以下是到目前为止我得到的信息: HTML 控制台日志显示此错误,并指向“person.setFirstName(firstName)”代码行: Uncaught TypeError: Object #<Person> has no method 'setFirstName' Uncaught TypeError:对象#没有方法“setFi
Uncaught TypeError: Object #<Person> has no method 'setFirstName'
Uncaught TypeError:对象#没有方法“setFirstName”
让我感到困惑的是,它识别出Person对象存在,但却没有看到方法setFirstName。我做错了什么?帮助我掌握代码,你是我唯一的希望。当前代码将对象文本分配给
人的原型。相反,将函数分配给Person.prototype
的setFirstName
属性:
Person.prototype.setFirstName = function(name) {
this.firstName = name;
console.log("My first name is: " + this.firstName);
}
解释
要理解错误,我们必须首先了解prototype
s在Javascript中的工作方式。当使用函数构造函数创建对象的实例时,实例的原型将被指定为构造函数的原型
function MyObject(){}
var myObj = new MyObject();
console.log(myObj.__proto__ == MyObject.prototype); //logs true
在提供的代码中,使用Person
构造函数创建Person
的实例。这将导致person
被分配person
的原型
var person = new Person();
function Person() {
this.firstName = "";
}
console.log(person.__proto__); //logs Person{}
Person.prototype = {
setFirstName: function(name) {
this.firstName = name;
console.log("My first name is: " + person.firstName);
}
}
然后将包含setFirstName
函数的对象文本分配给Person
的原型
var person = new Person();
function Person() {
this.firstName = "";
}
console.log(person.__proto__); //logs Person{}
Person.prototype = {
setFirstName: function(name) {
this.firstName = name;
console.log("My first name is: " + person.firstName);
}
}
此时,通过函数将Person
原型分配给对象文本,但是在将对象文本分配给Person
的原型之前创建了实例Person
。实例person
的原型未引用实例化后分配给person.prototype
的对象文本
console.log(person.__proto__ == Person.prototype); //logs false
虽然不推荐,但我们可以通过在分配新原型后创建person
实例来解决或避免此问题,例如:
$(document).ready( function() {
$("#firstName").on("change", getFirstName);
function Person() {
this.firstName = "";
}
Person.prototype = {
setFirstName: function(name) {
this.firstName = name;
console.log("My first name is: " + person.firstName);
}
}
var person = new Person();
function getFirstName() {
var firstName = $("#firstName").val();
person.setFirstName(firstName);
}
});
最好将该方法指定给Person.prototype
的属性,这样我们就不会创建时间耦合,从而决定何时可以创建Person
的实例
这篇文章在解释原型方面做得很好,值得一读。我的方法不只是简写吗?不,你正在用你创建的对象文字替换原型。修复了我的打字错误。谢谢你抓住它。把它改成你的建议,它就起作用了。谢谢@Frijolie很高兴我能帮忙@Frijolie我觉得我欠你一个更好的解释。请看更新后的帖子。