Javascript自定义对象是泛型的

Javascript自定义对象是泛型的,javascript,Javascript,我试图最大限度地重用一些代码。在我的自定义javascript对象上(为了简单起见,我将使用PhoneNumber作为示例),我设置了一个如下的原型函数: var Map = { write: function() { alert('My object is ' +this); } }; function PhoneNumber(number) { this.number = number; } PhoneNumber.prototype = Map;

我试图最大限度地重用一些代码。在我的自定义javascript对象上(为了简单起见,我将使用PhoneNumber作为示例),我设置了一个如下的原型函数:

var Map = {
    write: function() {
        alert('My object is ' +this);
    }
};

function PhoneNumber(number) {
    this.number = number;
}

PhoneNumber.prototype = Map;

//I can call the write function like so
var phoneObject = new PhoneNumber('1234567894');
phoneObject.write(); //ALERT My Object is Object{number:'1234567894'}
除了出于某种原因,它将我的PhoneNumber对象转换为一个通用对象,而不是保留其PhoneNumber构造函数之外,其他一切都可以正常工作。如果我真的像这样把write函数放在objects原型中,它就可以完美地工作

function PhoneNumber(number) {
    this.number = number;
}

PhoneNumber.prototype.write = function() {
    alert('My object is ' +this);
}

var phoneObject = new PhoneNumber('1234567894');
phoneObject.write(); //ALERT My object is PhoneNumber{number:'1234567894'}

但我真的不想这样做,因为多个对象使用write函数,它们都以完全相同的方式执行。如何避免对象将自身转换为泛型构造函数?显然,我在原型上设置Map对象的方式是错误的,但我不必将代码直接从Map复制到object prototype函数中,这一点非常重要。有什么想法吗?

我得到了
我的对象是[object object]
,这两个版本都在Firefox中

您可能想看看这篇老文章:


特别是,关于构造函数和使用
instanceof
检查对象类型的部分。请记住,JavaScript中没有类这样的东西,因此一旦实例化一个对象,它就真的没有“类型”的感觉,像
instanceof
之类的东西都是绕过这个问题的黑客。

似乎返回的对象是PhoneNumber,没有toString方法。 试试这个:

var Map = {
    write: function() {
        alert('My object is ' +this);
    }
};

function PhoneNumber(number) {
    this.number = number;
    this.toString = function(){return "PhoneNumber"}
}

PhoneNumber.prototype = Map;

//I can call the write function like so
var phoneObject = new PhoneNumber('1234567894');
phoneObject.write(); //ALERT My Object is Object{number:'1234567894'}

它在这里起作用。但是在这里,无论如何,您都需要告诉Map对象该对象的变量是number。

您忘记设置
PhoneNumber.prototype.constructor

如果执行
PhoneNumber.prototype=Map
操作,则会破坏构造函数属性

PhoneNumber.prototype = Map;
PhoneNumber.prototype.constructor = PhoneNumber;
当然,这是行不通的,因为如果您将
Map
用作多个原型,您只需执行
Map.constructor=PhoneNumber
,就会中断。所以你应该让PhoneNumber从map继承

PhoneNumber.prototype = Object.create(Map, {
  constructor: { value: PhoneNumber }
});

获取我的对象是我不想要的对象。它应该是PhoneNumber(或者我正在使用的任何构造函数)。我知道如何获取构造函数的名称,这就是问题所在,我无法获得实际的构造函数,因为出于某种原因,它将其转换为泛型对象。这就证明了为什么整个
新的
/
.constructor
/
.prototype
对于下面优雅的原型继承机制来说是一个很大的混乱和漏洞百出的语法糖,而
Object.create
才是真正的方法。QED:)是Object.create()跨浏览器解决方案吗?我理解它的工作原理有点困难?@ryandlf cross browser->yes,legacy browser->no。为什么使用Object.create方法比使用Umesh在另一个答案中的方式更好?我只是好奇,试图完全理解整个物体。创造东西。在我看来,Object.create在创建新对象时或多或少用于替换“new”关键字,而不是向现有原型添加函数。使用您的方法,我仍然能够调用phoneObj.write()?@ryandlf
对象。create
不会调用构造函数
phoneObj.write()。这种方法是唯一有效的方法。谢谢
PhoneNumber.prototype = Object.create(Map, {
  constructor: { value: PhoneNumber }
});