2012-06-20 32 views
1

我試圖創建一個簡單的可擴展的「類」 JavaScript,但在原型設置屬性時,它告訴原型是未定義:當試圖的Javascript的Object.prototype是不確定的

Class = {}; 
Class.extend = function(obj) { 
    var result = Object.create(this); 

    if (obj) { 
     for (var key in obj) { 
      if(typeof obj[key] == 'function'){ 
      console.log(result); 
      result.protorype[key] = obj[key]; 
      }else{ 
      result[key] = obj[key]; 
      }; 
     }; 

     result.prototype.constructor = result; 
    } 

    return result; 

} 

var a = Class.extend({ 
    username: "matteo", 
    password: "nn te la dico", 
    getByUsername: function() { 
     return this.username; 
    } 
}); 



console.log(a, Class.isPrototypeOf(a));​ 

的問題發生設置屬性「getByUsername」通過界定「一」的時候,如果你看一下控制檯會報告:

Uncaught TypeError: Cannot set property 'getByUsername' of undefined 

與「結果」記錄有屬性「用戶名」和「密碼」。

P.S它將在IE> 8

這裏只工作是一個小提琴http://jsfiddle.net/paglia_s/z62eA/

+1

'result.protorype [關鍵] = OBJ [關鍵];'或'result.prototype [key] = obj [key];'? – Matt

+0

@Matte原型 –

+0

@HackedByChinese沒有它已經手工建造 –

回答

2

只是不要使用以下命令創建對象: Class = {};

但通過使用: Class = function(){};

它創建帶有原型的新對象..

你的代碼看起來像這樣:

Class = function(){}; 

Class.extend = function(obj) { 
    var result = Object.create(this); 

    if (obj) { 
     for (var key in obj) { 
      if(typeof obj[key] == 'function'){ 
      console.log(result); 
      result.prototype[key] = obj[key]; 
      }else{ 
      result[key] = obj[key]; 
      }; 
     }; 

     result.prototype.constructor = result; 
    } 

    return result; 

} 

var a = Class.extend({ 
    username: "matteo", 
    password: "nn te la dico", 
    getByUsername: function() { 
     return this.username; 
    } 
}); 


console.log(a, Class.isPrototypeOf(a));​ 
+0

在這裏看到控制檯http://jsfiddle.net/paglia_s/z62eA/3 /,「a」可以正常工作,但在「b」中用戶名不會被覆蓋,因爲原來的是在原型中 –

+0

在我的控制檯a中有密碼和用戶名屬性以及原型。對於b我得到用戶名和原型。對於C我得到的原型(繼承函數)和D我得到用戶名和原始用戶名和密碼(來自一個)和原型(getByUsername和getto)..這不是你想要的? – pad31

+0

例如在原型中的b中有用戶名和密碼,它們應該在外面,並且用戶名從b而不是原始的 –

2

你有一個錯字。 result.protorype[key]應該是result.prototype[key]

+0

糾正它總是給出相同的錯誤http://jsfiddle.net/paglia_s/z62eA/ –