首先以博主的浅见,js一共只有8种数据类型,分别是:
三种基本类型:字符串型,数字型,布尔型
复合数据类型:数组,对象
其他数据类型:null,undifined
。
也就是说,js不存在类这个概念,js的继承并不是基于类的,而是基于原型对象的
狭义上说js只有一种机能实现了类似继承的东西:就是利用构造函数创建对象,这是对象有一个prototype属性,可以使用构造函数中的值。
在js中,所有对象都会有一个原型对象,对象会继承原型对象中的属性和方法,原型对象可以看做对象的一个属性,语法是这样的
object.prototype
在初始状态下prototype中什么都没有,下面这个例子的什么都没输出
<html>
<head>
<title>prototype</title>
<meta http-equiv=content-type content=text/html;charset=gb2312>
<script type=text/javascript>
function typeObject(){
this.attribute1="str";
this.attribute2=123;
this.attribute3=true;
}
//遍历原型对象
for(var obj in typeObject.prototype){
document.write(obj,":",myObject.prototype[obj],"<br>");
}
</script>
</head>
<body>
</body>
</html>
为方便起见,以下的例子我只写script标签中的js
以下语法是js原型对象的语法,它利用构造函数构造了一个对象。
function mobile(_price,_factory,_type,_size){ this._price=_price; this._factory=_factory; this._type=_type; this._size=_size; } //利用构造函数构造对象 var myMobile01=new mobile(1999,"小米","MI3",5.0); document.write("没有为原型对象添加属性时,myMobile对象中的所有属性:<br>"); for(var obj in myMobile01){ document.write(obj,":",myMobile01[obj],"<br>"); }
以上就是利用构造函数创建对象:这时的输出是:
没有为原型对象添加属性时,myMobile对象中的所有属性:
_price:1999
_factory:小米
_type:MI3
_size:5
可以在以上代码后面再加上一段代码用来说明prototype
mobile.prototype.interface="USB"; document.write("为原型对象添加一个属性,此时myMobile对象中的所有属性"); for(var obj in myMobile01){ document.write(obj,":",myMobile01[obj],"<br>"); }
此时的输出是:
没有为原型对象添加属性时,myMobile对象中的所有属性:
_price:1999
_factory:小米
_type:MI3
_size:5
为原型对象添加一个属性,此时myMobile对象中的所有属性:
interface:USB
_price:1999
_factory:小米
_type:MI3
_size:5
综上所述,可以这样理解,所谓js的继承是分以下三部实现的
- 创建构造函数
- 利用构造函数创建对象
- 创建出的对象自动有内置prototype属性,可以利用这个属性修改构造函数
或者我们不去生搬硬套java,我们这么说:js中没有继承这回事,只有原型对象,原型对象的机能是这样的:
创建构造函数
利用构造函数创建对象:var myMobile01=new mobile(1999,"小米","MI3",5.0);
这是myMobile01对象就会有个默认属性,是prototype,可以利用prototype来操作原型对象,也就是动态的去改变构造函数