使用对象作为原型

时间:2012-01-11 05:36:43

标签: javascript

有谁能告诉我为什么这段代码不起作用?

PhoneNumber.prototype = Map;

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

PhoneNumber.writeToDOM(Container);

是否无法根据对象的protype引用对象并使用所述对象的函数?我想要这样做的原因是我可以在多个对象上使用Map变量,而不是像这样重复每个对象的writeToDOM代码:

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

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

6 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

感谢变量声明提升,代码运行时实际发生的是:

var Map; // = undefined;

PhoneNumber.prototype = Map;

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

PhoneNumber.writeToDOM(Container);

无论在哪里放置var语句,JS都将它们视为处于该范围的顶部,但不会将值分配到行所在的位置你这样做了因此,在您尝试使用Map时,它仍未定义。

Map作业移至PhoneNumber.prototype = Map之前。

答案 2 :(得分: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);

答案 3 :(得分:0)

请尝试以下代码:

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

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


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

答案 4 :(得分: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"));

答案 5 :(得分:-2)

修改为:

  

var map;   PhoneNumber.prototype = Map;

     

Map = {       writeToDOM:function(container){           //别在这里       }};

     

PhoneNumber.writeToDOM(容器);