2010-06-19 131 views
2

我有這種類型的JavaScript原型繼承代碼。有沒有一種方法可以改變Javascript中的函數內的原型?

function A() { 
    this.a = 1; 
} 
function B() { 
    someEl.innerHTML(this.a); 
} 
B.prototype = new A(); 

不過,我想知道是否有更好的方式來做到這一點,最好是帶來原型聲明成B聲明。

我試過設置this.prototypeB,但它只是顯示this.aundefined

那麼,有沒有更好的方法來做到這一點?

回答

4

prototype屬性應該只在constructor functions使用,this.prototype不有道理的,因爲this只是新的對象實例,而不是構造函數。

在構造函數中指定prototype本身並不是一個好主意,因爲每次創建新對象時(new B();)都會執行該指定。

你的代碼似乎完全有效的對我來說,你應該知道的唯一的事情是,如果你更換一個構造函數的prototype財產,像你B.prototype = new A();做的B對象實例的constructor財產,將指向A

通常建議恢復該屬性,如:

function A() { 
    this.a = 1; 
} 

function B() { 
    someEl.innerHTML(this.a); 
} 

B.prototype = new A(); 
B.prototype.constructor = B; // restore the `constructor` property 

var foo = new B; 
foo.constructor === B; // true 

給看看到:

0

嘗試:

function A() { 
    this.a = 1; 
} 
function B() { 
    this.prototype = new A(); 
    someEl.innerHTML(this.A.a); //notice A.a 
} 
+2

這是有效的,但鑑於它意味着在原型繼承變量和它自己的成員之間進行區分,所以這可能是一種比問題更糟糕的治療方法(函數外的聲明)。 – Macha 2010-06-19 17:36:18

+0

我不知道任何其他方式做這樣的事情。在聲明它之前,不可能設置函數的原型。您目前使用的方法是「按書」方式。 – tcooc 2010-06-19 17:47:51

+0

指定'this.prototype'沒有意義,應該在[構造函數](https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Using_a_Constructor_Function)上使用'prototype'屬性,''這個值只是一個新的對象實例。 – CMS 2010-06-19 18:09:53

0
function MyClass() { 
    this.initialize(); 
} 

MyClass.prototype = { 
    initialize: function() {    // adding a function name 
     this.some_var = "Blue";   // makes debugging easier 
    }, 
    tell_color: function() { 
     alert(this.color); 
    }, 
    color: "red" 
} 

var instance = new MyClass(); 
instance.tell_color(); 

這不是我的主意,但我不知道了,我已經找到了。

0

JS中的繼承有點奇怪,但其他人都是糾正你不應該在構造函數中放置原型。原型函數/變量的重點在於,對於所有類的所有實例,您只能使用該函數的單一實例。同樣,它對班級變量很有好處,這是每個實例都會引用的奇異值。

真的,你應該做的B類繼承自A類:

function B(){ 
    this.object = new A(); 
} 

B.prototype.a = function(){ 
    return object.a; 
} 

它可以是一個有點惱人,因爲你必須再創建新的getter/setter方法,buuuuuuuttttt,如果你感覺有點冒險,你可以建立這樣的事情......

function breakApart(what){ 
    var functions = []; 
    var properties = []; 

    for(property in what){ 
     if(typeof what[property] == 'function'){ 
      functions.push({'name':property,'value':what[property]}); 
     }else{   
      properties.push({'name':property,'value':what[property]}); 
     } 
    } 

    var data = [ 
     {'title':'functions','data':functions}, 
     {'title':'properties', 'data':properties} 
     ]; 

    return data; 
} 

添加幾個eval()函數調用和一些邏輯,你可以讓這個功能打造你新的getter/setter方法/函數的引用。

相關問題