2012-01-11 58 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"));