首先我们可以看看平时我们常用的

    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();
str.indexOf('e');

这是为什么?

原因是:基本类型都有自己对应的包装对象 : String Number Boolean

也是说基本类型调用的方法,其实是挂载在它对应的包装对象上的。如下:

charAt方法在js源码中定义其实是这样定义的。

var str = new String('hello');

alert(str.charAt());

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

原型链请见下篇。

05-11 15:39
查看更多