2014-08-28 52 views
0

下面這不會引發任何錯誤:類型錯誤:不使用的功能,當新

Function.prototype.method = function (name, func) { 

    this.prototype[name] = func; 

}; 

Function.method('inherits', function (Parent) { 

    this.prototype = new Parent(); 
    this.prototype.construct = this; 

}); 


var p = function(){} 
var c = function(){} 

c.inherits(p) 

但下面這引發了「類型錯誤:_a.inherits是不是一個功能」:

Function.prototype.method = function (name, func) { 

    this.prototype[name] = func; 

}; 

Function.method('inherits', function (Parent) { 

    this.prototype = new Parent(); 
    this.prototype.construct = this; 

}); 


//var p = function(){} 
//var c = function(){} 

function a(){} 
function b(){} 

_a = new a(); 
_b = new b(); 

_a.inherits(_b) 

從我讀到的,新的返回值是一個函數。它必須是一個函數,因爲它具有可以使用和分配的原型屬性以及指向自身的構造函數屬性。在原型查找算法中,在通過Object.prototype之前,它應該在Function.prototype中發現「繼承」。沒有?

+0

爲什麼你認爲在'kid'存在'inherits'方法? – user2357112 2014-08-28 04:08:06

+0

@ user2357112因爲kid是一個函數,並且在Function.prototype上創建了繼承,並且原型查找算法在碰到Object.prototype之前應該通過Function.prototype。 – JohnMerlino 2014-08-28 04:09:54

+0

@ user2357112它只有在使用new關鍵字時纔會失敗。沒有新的關鍵字,不會引發錯誤。新的關鍵字應該返回一個函數,畢竟只有函數有一個原型屬性和一個指向函數本身的構造函數。 – JohnMerlino 2014-08-28 04:20:16

回答

0

首先,新的返回值是不是一個函數。

當使用new關鍵字調用某個函數時,會創建一個新對象並將其分配給構造函數中的「this」並返回。

另外創建的對象沒有原型屬性。可以確認:

alert(typeof kid); // object 
    alert(kid['prototype']); //undefined 
    alert(kid['constructor'].prototype); //object 

據我所知,通過這個構造函數的屬性,原型繼承的作品。

+0

所以它有一個構造函數屬性指向該對象的創建函數,因此您可以通過該函數訪問原型屬性。因此,繼承就是這樣建立的。 – JohnMerlino 2014-08-28 05:17:22

0

kid不是一個函數,它是一個object。你可以對這裏的new關鍵字讀了起來:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

下面是根據你的代碼的一些用法:

所有的
var kid = Child; 
kid.inherits(Parent); 

var bart = new kid(); 
bart.say(); 
+0

在我接受孩子是一個對象而不是函數之前,爲什麼它有權訪問prototype屬性?只有函數可以使用原型屬性。 – JohnMerlino 2014-08-28 04:25:18

+0

您可以查看警報結果(typeof kid);它返回對象而不是函數。 – coder 2014-08-28 04:28:11

+0

@coder是的我可以做到這一點,它會返回一個對象。但是我的問題仍然存在,如果它是一個對象而不是一個函數,那爲什麼它能夠修改和使用原型屬性?要創建一個原型鏈,你必須創建一個函數。 – JohnMerlino 2014-08-28 04:29:12

0

_a不是function這是一個object與您的js functions寫道inherits(Parent)所以 調用它的函數,然後創建一個從繼承function新的對象。

EG-

 b.prototype.y=function(){ //add y to b 
     alert("y from b called"); 
     } 
     a.inherits(b);//inherits function b 
     _a = new a();//create obj from a after inheritence 
     _a.y();// call method of b 
相關問題