JS面向对象组件(一) ---包装对象与原型链
首先我们可以看看平时我们常用的
var str = 'hello'; alert(typeof str); //string var str = new String("hello"); alert(typeof str); //object
上面那个是表示基本类型string类型,下面这个是表示对象类型(String对象类型)
然而纵使是string基本类型,依然可以调用charAt等方法
var str = 'hello'; str.charAt(0); str.indexOf('e');
这是为什么?
原因是:基本类型都有自己对应的包装对象 : String Number Boolean
也是说基本类型调用的方法,其实是挂载在它对应的包装对象上的。如下:
charAt方法在js源码中定义其实是这样定义的。
var str = new String('hello'); alert(str.charAt(1)); String.prototype.charAt = function(){};
str.charAt(0);执行的具体过程如下图中所示:
//var str = 'hello'; //str.charAt(0); //基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失(过程就是这样的)
所以若是自己要定义一个方法,可以在原型上挂载一个方法,如下:
/*var str = 'hello'; String.prototype.lastValue = function(){ return this.charAt(this.length-1); }; alert( str.lastValue() ); //o*/
所以下面这种写法就是不对了:
var str = 'hello';
str.number = 10;
alert( str.number ); //undefined
原型链请见下篇。