函数原型继承与新关键字

时间:2016-01-05 19:58:05

标签: javascript prototype new-operator

我确保我正确理解了JavaScript的newprototype个关键字,但是我放在一起的一些简单代码并不像我期望的那样。

var ClassA = function() {
    return {
        shout: function() {
             alert("I can shout");
        }
    };
};
ClassA.prototype.shoutLouder = function() {
     alert("I CAN SHOUT");
};

var instance = new ClassA();
instance.shout();

// why not available?
instance.shoutLouder();

当实例变量尝试调用shoutLouder时,“未捕获的TypeError:instance.shoutLouder不是函数”

但是,在mozilla docs中,它表示在使用new创建对象时:

  

创建一个新对象,继承自Foo.prototype。

我的理解错在哪里?

Here is a jsbin代码为snippit。

2 个答案:

答案 0 :(得分:3)

您正在失去对函数(Class')原型对象的访问权限,因为您正在从函数中返回一个新对象:

var ClassA = function() {
    return {
        shout: function() {
             alert("I can shout");
        }
    };
};

而你应该这样做:

var ClassA = function() {
    this.shout = function() {
        alert("I can shout");
    };
};

这仍然允许您访问原型对象(因此委托链仍然有效),因为new关键字将从Class返回“this”。

答案 1 :(得分:1)

ClassA返回一个新的不同对象

 return {
        shout: function() {
             alert("I can shout");
        }
    };

尝试

var ClassA = function() {
    this.shout = function() {
             alert("I can shout");            
    };
};
ClassA.prototype.shoutLouder = function() {
     alert("I CAN SHOUT");
};

var instance = new ClassA();

instance.shout();

// why not available?
instance.shoutLouder();