1
     function inherit(p){
        if(p == null) throw TypeError();
        if(Object.create) return Object.create(p);
        var t = typeof p;
        if(t != "function" || t != "object") throw TypeError();
        function f(){};
        f.prototype = p;
        return new f;
    }


    function Super_class(){
        this.Sup_prop = "I'm superclass";
        this.Sup_prop2 = "I'm superclass2";
    }
    Super_class.prototype.Hello = function(){ alert("Hello"); };


    function Sub_class(){
        this.sub_prop = "I'm subclass";
        this.sub_prop2 = "I'm subclass 2";
    }
    Sub_class.prototype = inherit(Super_class);
    Sub_class.prototype.constructor = Sub_class;

    var x = new Sub_class;
    x.Hello();

这段代码来自 Javascript The Definitive Guide book,解释了如何创建子类,但它不起作用。

我曾经在这个网站上看到过关于如何创建子类的代码。

    function Super_class(){
        this.Sup_prop = "I'm superclass";
        this.Sup_prop2 = "I'm superclass2";
    }
    Super_class.prototype.Hello = function(){ alert("Hello"); };


    function Sub_class(){
        this.sub_prop = "I'm subclass";
        this.sub_prop2 = "I'm subclass 2";
    }
    Sub_class.prototype = new Super_class;

    var x = new Sub_class; // change here
    x.Hello();// It work!!

我想知道为什么我书中的代码不起作用。我的书有错误或我错了。

PS我的英文写得不好,对不起。

更新 这是我上面的第一个例子。

    Sub_class.prototype = inherit(Super_class);
    Sub_class.prototype.constructor = Sub_class; //Why did set be Sub_class??

我想知道为什么“Sub_class.prototype.constructor”设置为Sub_class?我的书没有解释。

4

2 回答 2

1

你应该通过

Super_class.prototype

而不是Super_class继承函数。它似乎期望一个原型对象,而不是函数本身

于 2013-04-08T02:53:00.267 回答
1

问题出在你的inherit函数中,特别是这一行:

if(Object.create) return Object.create(p);

这将返回一个新对象,其原型设置为p。但是,p不是Super_class; 这是功能Super_class。我不确定inherit当它接收一个对象作为参数时你想做什么,但是当它接收一个函数时,你不想使用Object.create. 试试这个从 for 开始inherit

function inherit(p) {
    if (typeof p === 'function') {
        return new p;
    }
    throw TypeError()
}
于 2013-04-08T02:55:57.173 回答