2012-01-11 62 views
0

誰能告訴我爲什麼這段代碼不起作用嗎?使用一個對象作爲原型

PhoneNumber.prototype = Map; 

var Map = { 
    writeToDOM : function(container) { 
     //DO STUFF HERE 
    } 
}; 

PhoneNumber.writeToDOM(Container); 

是不可能引用一個對象的對象的原型並使用該對象的函數?我之所以要這麼做是這樣的話,我可以使用多個對象的地圖變量,而不是重複writeToDOM代碼這樣每個對象:

Object1.prototype.writeToDOM = function() { 
    //DO STUFF HERE 
} 

Object2.prototype.writeToDOM = function() { 
    //DO the exact same stuff as Object1 
} 
+0

http://mckoss.com/jscript/object.htm – 2012-01-11 05:39:39

+0

你能告訴,PhoneNumber對象包含什麼? – 2012-01-11 07:59:04

回答

1

您的代碼等同於以下內容:

var Map; 
PhoneNumber.prototype = Map; 

Map = { 
    writeToDOM : function(container) { 
     //DO STUFF HERE 
    } 
}; 

PhoneNumber.writeToDOM(Container); 

也就是說,您正在將PhoneNumber.prototype分配到Map,其中當前包含undefined。然後,您將Map重新分配一個新值,但根本不會更改PhoneNumber.prototype


如果你簡單地分配原型Map之前分配Map到所需的對象,你會確定:

var Map = { 
    writeToDOM : function(container) { 
     //DO STUFF HERE 
    } 
}; 

PhoneNumber.prototype = Map; 

PhoneNumber.writeToDOM(Container); 
+0

除了最後一行,一切正常:'writeToDOM'存在於'PhoneNumber.prototype'中,而不是'PhoneNumber'中。您必須將其稱爲'PhoneNumber.prototype.writeToDOM(...)'或者'PhoneNumber'是一個函數,作爲'new PhoneNumber()。writeToDOM(...))'PhoneNumber.prototype'中存在' – 2012-01-11 07:33:03

0

你可以使用這樣的事情:

var Map = { 
    writeToDOM: function() { 
    // stuff 
    } 
} 

var extend = function(obj, proto) { 
    for(var k in proto) { 
    obj.prototype[k] = proto[k]; 
    } 
} 

extend(Object1, Map); 
extend(Object2, Map); 
0

試試下面的代碼:

function PhoneNumber(){} 
PhoneNumber.prototype = Map; 

var Map = { 
    writeToDOM : function() { 
    console.log("test"); 
    } 
}; 


var instance = new PhoneNumber(); 
instance.writeToDOM(); 
1

由於變量聲明提升,當你的代碼運行的是什麼是真正發生這樣的:

var Map; // = undefined; 

PhoneNumber.prototype = Map; 

Map = { 
    writeToDOM : function(container) { 
    //DO STUFF HERE 
    } 
}; 

PhoneNumber.writeToDOM(Container); 

無論在哪裏把你JS對待它們就好像它們位於該範圍的頂部一樣,但不會將值分配到您執行此操作的那一行。所以在你嘗試使用Map的地方,它仍然是未定義的。

將您的Map作業移至PhoneNumber.prototype = Map之前。

+0

'writeToDOM',而不是'PhoneNumber'。你不能將'writeToDOM'作爲'PhoneNumber.writeToDOM(...)' – 2012-01-11 07:35:54

-2

修改此:

VAR地圖; PhoneNumber.prototype = Map;

Map = { writeToDOM:function(container){ //在這裏做菜餚 }};

PhoneNumber.writeToDOM(Container);

+0

我沒有downvote,但這不起作用。在嘗試使用該值之前,必須將該值分配給「Map」。 – nnnnnn 2012-01-11 06:49:34

+0

是的,你是對的!我混淆了'通過參考'和'通過分享'。對不起。 :-(。 – trinity 2012-01-11 07:59:25

0

按照我的說法,也可以不使用原型。

var Map = { 
    writeToDOM : function(container) { 
     console.log("written to "+container); //container is string 
    } 
}; 
function PhoneNumber(name,no){ 
     var map=Map; 
    this.name="user"; 
    this.no=100; 
     return{ 
     toString:function(){ 
      return this.name+"-"+this.no; 
      }, 
     writeToDOM:map.writeToDOM 
     } 
} 
var phone1=new PhoneNumber("cham",100002); 
console.log(phone1.writeToDOM("body"));