一、类型的分类
1、判断一个“数据”的类型的方法:
1)值类型:number、string、boolean、undefined
2)引用类型:object
- 值类型的数据:用typeof()
<script>
console.log(typeof ("aa"));
console.log(typeof(10));
console.log(typeof(null));
console.log(typeof(undefined));
</script>
输出结果:string
number
object
undefined
(null是属于object类型的)
- 引用类型:用instanceof ;
instanceof的作用:instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
function fun(){}
console.log(fun instanceof Object);
var array=new Array();
console.log(array instanceof Array);
//输出结果:true
typeof只能检测到Object那一层,而instanceof可以判断对象的具体类型。
二、原型链
每一个函数function有一个对应的原型,且它有constructor属性。每个对象都有一个隐藏的属性proto(称他为隐式原型),并且指向该对象的原型。
1、prototype原型:
- 所有的函数都是对象
- 含有prototype属性的称为原型对象,含有constructor属性的称为原型构造器
所有的proto都指向Object的原型;注意:对于有些低版本的浏览器可能不支持这个属性,
从上面的图我们可以知道,对象stu的proto和Student函数的prototype都指向Student的隐式原型,下面用实例来看一下:
function Student(){
this.name="张三",
this.age=20
}
var stu=new Student();
console.log(Student.prototype);
console.log(stu.__proto__);
输出结果:
当我们给Student的一个属性的prototype赋值,那么它会怎么输出呢?
function Student(){
this.name="张三",
this.age=20
}
Student.prototype.school="中南大学";
var stu1=new Student();
var stu2=new Student();
console.log(stu1.school);
console.log(stu2.school)
stu1.school="湖南大学";
console.log(stu1.school);
console.log(stu2.school);
一个对象实例取属性,先看自己绑定了没有,如果自己没有绑定,那么它就会去构造这个实例的构造器去找,如果如果构造器没有,才会从它的proto指向的对象去找。所以,前面两个都会输出“中南大学”,后面两个分别会输出“湖南大学”、“中南大学”。对于前面两个输出,stu1和stu2上都没有绑定school属性,在它的构造器上也没有这个属性,所以它们回去找它的proto指向 对象。而对于第三个输出来说,stu1绑定了school属性,所以它会找自己的,而不会再去找它的proto指向 对象。
输出结果:
如果在student函数里面绑定school属性,
function Student(){
this.name="张三";
this.age=20;
this.school="华中科大";
}
Student.prototype.school="中南大学";
var stu1=new Student();
var stu2=new Student();
console.log(stu1.school);
console.log(stu2.school)
stu1.school="湖南大学";
console.log(stu1.school);
console.log(stu2.school);
输出结果: