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

原型链请见下篇。

原文地址:https://www.cnblogs.com/wanliyuan/p/5244622.html