是否可以在javascript中创建自己的自定义本机对象?

时间:2018-12-16 12:35:12

标签: javascript

是否可以制作自己的自定义本机对象,例如字符串,数字,数组,日期等??

我想使一个对象直接使用它的本机值,我已经阅读了Object.valueOf以及如何使用它的信息,但是只有当您尝试使用ajax发送该对象时,它才能在操作中使用。会将整个对象连同其原型一起发送,我不想要

比如说我有一个电话对象

function Phone(a){
   this.value=a;
}

Phone.prototype={
    getAreaCode:function(){
       return this.value.substr(0,3);
    }
}

var a = new Phone('938-358-395');
console.log(a);
//I want the output here to be '938-358-395' instead of Phone{value:'938-358-395'}
// just like how a Date Object would normally go when you do this

var b = new Date();
console.log(b);
//output would be 'Sun Dec 16 2018 20:20:28 GMT+0800 (China Standard Time)')

//as what I've said earlier I want to send it via ajax like this

var c = {
    phone1: new Phone('938-358-395'),
    phone2: new Phone('938-358-394')
};

//now I want to send c via ajax but the outcome will be
//{phone1: Phone {value:'938-358-395'},phone2: Phone {value:'938-358-394'}}
//what I want is {phone1: '938-358-395', phone2: '938-358-394'}

2 个答案:

答案 0 :(得分:1)

  

我想通过ajax发送c

答案取决于您对c进行序列化以通过ajax发送它的方式,因为您当然需要发送 text

如果您使用的是JSON,则可以实现toJSON将使用的JSON.stringify方法:

function Phone(a){
   this.value=a;
}

Phone.prototype={
    constructor: Phone,
    getAreaCode:function(){
       return this.value.substr(0,3);
    },
    toJSON: function() {
       return this.value;
    }
};

var c = {
    phone1: new Phone('938-358-395'),
    phone2: new Phone('938-358-394')
};

console.log(JSON.stringify(c));

如果您使用其他序列化,它们可能会导致将Phone对象转换为字符串,因此实现toString可以做到:

function Phone(a){
   this.value=a;
}

Phone.prototype={
    constructor: Phone,
    getAreaCode:function(){
       return this.value.substr(0,3);
    },
    toString: function() {
       return this.value;
    }
};

var c = {
    phone1: new Phone('938-358-395'),
    phone2: new Phone('938-358-394')
};

// Not just doing String(c), since c doesn't implement toString
console.log(String(c.phone1) + ", " + String(c.phone2));

或者当然要同时实现:

function Phone(a){
   this.value=a;
}

Phone.prototype={
    constructor: Phone,
    getAreaCode:function(){
       return this.value.substr(0,3);
    },
    toJSON: function() {
       return this.toString();
    },
    toString: function() {
       return this.value;
    }
};

var c = {
    phone1: new Phone('938-358-395'),
    phone2: new Phone('938-358-394')
};

// Not just doing String(c), since c doesn't implement toString
console.log(String(c.phone1) + ", " + String(c.phone2));
console.log(JSON.stringify(c));


侧面说明:如果完全替换构造函数的prototype属性,请确保修复constructor属性,使其指向正确的函数。请注意,我已经在上面的摘要中添加了constructor: Phone

当然,在2018年(2019年临近),您可以使用class语法,如果需要支持旧版浏览器,则可以进行编译:

class Phone {
    constructor(a) {
        this.value = a;
    }
    getAreaCode() {
        return this.value.substr(0, 3);
    }
    toJSON() {
        return this.toString();
    }
    toString() {
        return this.value;
    }
}

答案 1 :(得分:1)

这与“原生性”无关,JavaScript解释器包含ECMA定义的符号组合中的NumberString等符号,事实上,它们指定了JavaScript这些天的语言。是的,符号是语言的一部分,但由用户代理提供。除此之外,还有一系列作为“ Web平台”一部分提供的符号-用户代理选择实施和包含的任何符号都在不同的Web API中定义,包括JSON符号。

JavaScript是完美的内容,可让您定义自己的符号,包括类。

您的误解是期望Console API(主要通过console全局公开)的行为与提供Phone对象时所期望的行为相同。它不会那样做。 console.log(以及其他类似功能的控制台功能,例如debugwarninfo等)在内部解释它是什么类的对象,并插入开发人员工具以方便地显示对象。

对于您定义的任何对象类,该类都不属于它将以特殊方式解释的类集,它只会告诉您这些对象是什么类及其内部组成-其属性,通常。

您可以使用console.logJSON.stringify来控制toString将对象作为字符串转储的方式,否则可以使用该字符串。

或者您可以定义自己的Console类,并覆盖console这样的行为,在遇到Phone对象时,可以用自定义格式显示它们。但是,您不能期望内部console对象将您的Phone对象识别为某个特殊类-为此,它们是属于Object子类型的类的对象,仅此而已