2013-10-04 66 views
0

为什么jordan的属性不是Human类?不应该说Coder.prototype = new Human;足以让所有Coder类继承Human类的所有属性?JavaScript中的继承不起作用

它是否与将函数定义为赋值有关?

var Human = function() { 
    var hi = function() { 
     alert('hi'); 
     }; 
    return { 
     name : 'dan', 
     sayHi : hi 
    }; 
}; 

var dan = new Human(); 

var Coder = function() { 
    var code = function() { 
     alert('1010101'); 
    };  
    return { 
    code : code 
    }; 
}; 

Coder.prototype = new Human; 
Coder.prototype.constructor = new Coder; 
var jordan = new Coder(); 
console.log(jordan); 
+1

是否有一个原因,你想隐藏瓦尔码嗨? –

+1

只需要说JavaScript中的继承“很好运行”。你的代码不起作用。 – pkuderov

+0

@pkuderov伟大的贡献。 – user2727253

回答

1

这是一个有趣的事情:一个JS构造函数可以返回一个成为这个的对象。但是这个对象并不遵循构造函数定义的原型(在这种情况下,它是一个普通的Object)。看起来像您的代码的正确方法是:

var Human = function() { 
    var hi = function() { 
     alert('hi'); 
    }; 
    this.name = "dan"; 
    this.sayHi = hi; 
}; 

// or even: 
var Human = function() { 
    this.name = "dan"; 
}; 

Human.prototype.sayHi = function() { 
    alert('hi'); 
}; 

Coder类似。继承代码是OK的。

+0

ahhhh,我知道它与此有关,但为什么我不能有一个函数重新定义它是这样的。我希望能够遵循我的典型别名返回一个函数,但仍然能够原型。有没有解决方法?我可以明确定义构造函数吗? – user2727253

+0

不,我不认为有:) –

+1

继承代码是*几乎*好吧:调整构造函数的部分应该是'Coder.prototype.constructor = Coder;' – bfavaretto

2

您的构造函数不会返回它们正在创建的对象,因此继承将不起作用。用这个代替:

var Human = function() { 
    this.sayHi = function() { 
     alert('hi'); 
    }; 
    this.name = 'dan'; 
}; 

var dan = new Human(); 

var Coder = function() { 
    this.code = function() { 
     alert('1010101'); 
    };  
}; 

Coder.prototype = new Human; 
Coder.prototype.constructor = Coder; 
var jordan = new Coder(); 
console.log(jordan); 

另一种选择,从Human移动的东西原型:

var Human = function() {}; 
Human.prototype.sayHi = function() { 
    alert('hi'); 
}; 
Human.prototype.name = 'dan'; // will be shadowed if redefined on instances 

var Coder = function() {}; 
Coder.prototype = Object.create(Human.prototype); 
Coder.prototype.code = function() { 
    alert('1010101'); 
}; 
var jordan = new Coder(); 
console.log(jordan); 

一种Object.create填充工具是available on MDN

+0

我希望在函数结束时使用我的标准别名。有没有工作?将功能添加到原型是更好更有效的方法! – user2727253

+0

没有办法使用原型并同时返回一个全新的对象。也许你可以直接使用Object.create?例如:'var extendedObj = Object.create(baseObj)',不需要使用构造函数(当然可以将它包装在一个函数中,但不会用'new'调用它)。 – bfavaretto