作者fillano (冒牌费大公)
看板Ajax
标题Re: [问题] 如何对 String 实施继承?
时间Mon Mar 16 01:34:21 2009
尝试这样做,让NewType与String相容:
<html>
<body>
<script>
function NewType(str) {
this._str = str;
this.toString = function() {
return this.valueOf();
}
this.valueOf = function() {
if(this._str && typeof(this._str)==="string") {
return this._str||"";
} else {
throw("Type Error.");
}
}
}
NewType.prototype = new String;
NewType.prototype.trim = function() {
return this.replace(/^\s+|\s+$/, '');
};
var b = new NewType("a new day is coming ");
alert(b);
alert(b+"|");
alert(b.indexOf("co"));
alert(b.trim()+ "|");
alert(b.toUpperCase());
</script>
</body>
</html>
看起来需要做几件事:
1. constructor (也就是NewType这个function)需要模仿String来传入参数
2. 必须用自己的方法实作toString以及valueOf方法
alert(b)会用到toString
alert(b+"|")会用到valueOf
String的native方法以及你用prototype挂上去的方法,好像都会呼叫toString。
我没仔细看ECMA-262,不过这样是可以跑的。
--
Sapere Aude! 这就是启蒙运动的口号!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.248.166.83
1F:推 legnaleurc:嗯...的确是可以动了,不过如果使用 03/16 14:03
2F:→ legnaleurc:new String( ... )或是null来初始化NewType 03/16 14:04
3F:→ legnaleurc:行为就会和String不一样QQ 03/16 14:04
4F:→ legnaleurc:第二种状况我是直接丢 exception 03/16 14:05
5F:→ legnaleurc:但是第一种似乎不能用typeof来看 03/16 14:06
6F:→ fillano:如果不用new NewType("xxx")的方式来初始化,那干麽要继承 03/16 15:23
7F:→ fillano:?用composite就好了阿? 03/16 15:24
8F:→ fillano:嗯嗯,看了一下ecma-262,看起来关键是实作valueOf跟 03/16 22:28
9F:→ fillano:toString,这样继承的函数就可以执行,constructor传进来 03/16 22:29
10F:→ fillano:的参数,只要合理地处理,让valueOf跟toString可以正确执 03/16 22:30
11F:→ fillano:行应该就可以跑了。String物件的这些方法,动作的第一步都 03/16 22:31
12F:→ fillano:是呼叫ToString,而使用"+"来做字串运算时,会呼叫valueOf 03/16 22:32
13F:→ fillano:,所以只要这两个正确运作就可以呼叫从String继承来的方法 03/16 22:33
14F:推 legnaleurc:喔喔,也就是说因为没有处理自己的toString 03/16 23:03
15F:→ legnaleurc:才会失败 谢谢指教!:P 03/16 23:03
16F:推 gpmm:推一下费大,这篇实在有 m 的价值! 03/18 22:06