javascript中用构造器创建对象与字面量创建对象的区别
2016-08-01 本文已影响0人
harveySpector
http://m.blog.csdn.net/blog/z1547840014/9734179
当用new操作符调用一个函数时,就会创建一个新的javascript对象.接着,该函数会作为该新建对象的this值被调用,而在原始调用中所使用的参数也都将一并传递给该函数调用
下面我们来研究下使用构造器处创建对象和使用字面量创建对象的区别到底是什么,先看下面的代码
function Circle(radius){
this.radius = radius;
}
var cicr = new Circle(6);
var cicr2 = {radius:6};
上面两个对象都会拥有2个属性,如果对js这块熟悉的同学想必已经猜到了这2个属性,一个是radius属性,另一个就是从object.prototype继承而来的属性.对于radius属性,他们没有任何区别。但是对于这个原型属性,内部实现上有细小的区别。cicr2是直接继承了object.prototype属性,而cicr是间接继承了object.prototype属性。cicr首先继承了Circle上的原型属性,这个原型属性又继承了object.prototype属性,所以它也完成了对object.prototype的继承。为了得到这种具体的关系,我们可以使用instanceof和constructor来检验他们内部的实现细节
alert(cicr instanceof Object)
//判断cicr对象是否属于Object对象,结果为true
alert(cicr instanceof Circle)
//判断cicr对象是否属于Circle对象,结果为true
alert(cicr2 instanceof Object)
//判断cicr2对象是否属于Object对象,结果为true
alert(Circle==cicr.constructor) //判断cicr对象的构造方法是否是Circle,结果为true
alert(Object==cicr2.constructor) //判断cicr2对象的构造方法是否是Object,结果为true
alert(Object==cicr.constructor) //判断cicr对象的构造方法是否是Object,结果为false
从上面6个例子我们可以看出instanceof和constructor的区别,也可以得到一条用的结论,即:只要一个对象a的内部prototype属性或者它的原型链上的任意对象与b.prototype是同一个对象,那么a instanceof b就返回true