Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 我的对象没有方法?_Jquery_Oop_Console.log - Fatal编程技术网

Jquery 我的对象没有方法?

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

我很难理解为什么这个代码不起作用。据我所知,我的语法是正确的,但是console.log抱怨我的person对象没有方法setFirstName。以下是到目前为止我得到的信息:

HTML

控制台日志显示此错误,并指向“person.setFirstName(firstName)”代码行:

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我觉得我欠你一个更好的解释。请看更新后的帖子。