是否可以制作自己的自定义本机对象,例如字符串,数字,数组,日期等??
我想使一个对象直接使用它的本机值,我已经阅读了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'}
答案 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定义的符号组合中的Number
,String
等符号,事实上,它们指定了JavaScript这些天的语言。是的,符号是语言的一部分,但由用户代理提供。除此之外,还有一系列作为“ Web平台”一部分提供的符号-用户代理选择实施和包含的任何符号都在不同的Web API中定义,包括JSON
符号。
JavaScript是完美的内容,可让您定义自己的符号,包括类。
您的误解是期望Console
API(主要通过console
全局公开)的行为与提供Phone
对象时所期望的行为相同。它不会那样做。 console.log
(以及其他类似功能的控制台功能,例如debug
,warn
,info
等)在内部解释它是什么类的对象,并插入开发人员工具以方便地显示对象。
对于您定义的任何对象类,该类都不属于它将以特殊方式解释的类集,它只会告诉您这些对象是什么类及其内部组成-其属性,通常。
您可以使用console.log
或JSON.stringify
来控制toString
将对象作为字符串转储的方式,否则可以使用该字符串。
或者您可以定义自己的Console
类,并覆盖console
这样的行为,在遇到Phone
对象时,可以用自定义格式显示它们。但是,您不能期望内部console
对象将您的Phone
对象识别为某个特殊类-为此,它们是属于Object
子类型的类的对象,仅此而已