【问题标题】:My Object has no method?我的对象没有方法?
【发布时间】:2014-03-15 15:48:24
【问题描述】:

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

HTML

<input type="text" id="firstName">

jQuery

$(document).ready( function() {
    $("#firstName").on("change", getFirstName);

    var person = new Person();

    function Person() {
        this.firstName = "";
    }

    Person.prototype = {
        setFirstName: function(name) {
            this.firstName = name;
            console.log("My first name is: " + person.firstName);
        }
    }

    function getFirstName() {
        var firstName = $("#firstName").val();
        person.setFirstName(firstName);
    }
});

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

Uncaught TypeError: Object #<Person> has no method 'setFirstName'

令我困惑的是,它识别出 Person 对象存在,但没有看到 setFirstName 方法。我做错了什么?帮助我掌握编码器,你是我唯一的希望。

【问题讨论】:

    标签: jquery oop console.log


    【解决方案1】:

    当前代码将对象字面量分配给Person 的原型。而是将函数分配给Person.prototypesetFirstName 属性:

    Person.prototype.setFirstName = function(name) {
            this.firstName = name;
            console.log("My first name is: " + this.firstName);
    }
    

    说明

    要理解错误,我们首先要了解prototypes 在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{}
    

    然后将包含setFirstName 函数的对象字面量分配给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 实例的临时耦合。

    这个article 很好地解释了prototype,值得一读。

    【讨论】:

    • 我的方式不就是这个的简写吗?
    • 不,您正在用您创建的对象文字替换原型。
    • 修正了我的错字。谢谢你抓住它。将其更改为您的建议,并且可以正常工作。谢谢!
    • @Frijolie 很高兴我能帮上忙!
    • @Frijolie 我觉得我欠你一个更好的解释。请查看更新后的帖子。
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多