使用对象作为原型

Using an object as a prototype

本文关键字:原型 对象      更新时间:2023-09-26

有人能告诉我为什么这个代码不起作用吗?

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

是否不可能参考对象的原型并使用所述对象的功能?我想这样做的原因是,我可以在多个对象上使用Map变量,而不必为每个对象重复writeToDOM代码,如下所示:

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

您的代码等效于以下内容:

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

也就是说,您正在将PhoneNumber.prototype分配给当前包含undefinedMap。然后将Map重新指定为新值,但根本不更改PhoneNumber.prototype


如果在将原型分配给Map之前,您只需将Map分配给所需的对象,那么您就可以了:

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

多亏了变量声明提升,代码运行时实际发生的事情是:

var Map; // = undefined;
PhoneNumber.prototype = Map;
Map = {
   writeToDOM : function(container) {
     //DO STUFF HERE
   }
};
PhoneNumber.writeToDOM(Container);

无论var语句放在哪里,JS都会把它们当作在该范围的顶部,但直到你这样做的那一行才赋值。因此,在你尝试使用Map的时候,它仍然是未定义的。

将您的Map分配上移到PhoneNumber.prototype = Map之前。

您可以使用这样的东西:

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);

尝试以下代码:

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

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

根据我的说法,这也可以在不使用原型的情况下完成。

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"));

修改为:

var映射;PhoneNumber.prototype=地图;

映射={writeToDOM:函数(容器){//在这里做事}};

PhoneNumber.writeToDOM(容器);