1

我以为我了解了 javascript 原型对象以及如何使用它,但现在我遇到了一些让我有点难过的事情。当尝试运行下面的代码mpo.testFire()时,没有任何问题,但我收到错误 Uncaught TypeError: Object # has no method 'fireAlert' when trying to invoke mpo.fireAlert(),我认为这是原型的一部分:

<body>
     <a href="#" id="testBtn">Click Me</a>
</body>

// Click handler, create new object
// call parent method and prototype method
$("#testBtn").click(function(e) {
   e.preventDefault();
   var mpo = new Myobject();
   mpo.testFire();
   mpo.fireAlert();
});

Myobject = function () {
    var testFire = function () {
        alert('testFire');
    };

    return {
        testFire:testFire
    };
};

Myobject.prototype = function() {
    var fireAlert = function() {
         alert('made it to fireAlert');   
    };

    return {
        fireAlert:fireAlert
    };
}();

如果我更改代码并将所有内容移动到对象的原型中,就像下面的代码一样,一切都会按预期工作:

 $("#testBtn").click(function(e) {
   e.preventDefault();
   var mpo = new Myobject();
   mpo.testFire();
   mpo.fireAlert();
});

Myobject = function () {
    // constructor logic here maybe?
};

Myobject.prototype = function() {
    var fireAlert = function() {
         alert('made it to fireAlert');   
    };

    var testFire = function () {
        alert('testFire');
    };

    return {
        fireAlert:fireAlert,
        testFire:testFire
    };
}();

我猜测存在范围问题,因为在第一个示例中,我从父对象返回了一个接口。谁能解释为什么第一个例子不起作用?

4

2 回答 2

2

您正在从 MyObject 构造函数的第一个实现返回一个对象文字,该构造函数对原型链 MyObject 的一部分一无所知。在第二个实现中,空构造函数返回创建的新上下文,它实际上是一个 MyObject 对象,它知道适当的原型链

于 2013-06-04T18:46:41.823 回答
1

您正在返回一个对象文字

return {
    testFire:testFire
};

它“覆盖”了结果new(因为它是一个对象。例如,返回字符串文字将返回创建的对象)。

这在ES5 规范 13.2.2中。

于 2013-06-04T18:45:12.380 回答