什么是constructor属性?它来自哪里?又将会指向何处?
什么是constructor属性?
constructor是构造函数属性。
它来自哪里?
其实constructor属性是来自 prototy原型属性 所指向的那个对象的属性,若是不明白这里的“那个对象”具体指的是哪一个对象,能够看看我上一章讲的javascript面向对象——prototype属性(原型属性),里面有着详细的讲解。
又将指向何处?
从constructor属性的字面意思咱们就不难看出,它指向的永远都是构造函数。
例如:
咱们看看下面代码:
function myfile(name,age){
this.webname = name;
this.age = age;
}
myfile.prototype.getname = function () {
return this.age;
}
var myfile1 = new myfile("zhang",3);
console.info(myfile1.constructor);
console.info(myfile.constructor);
console.info(myfile.prototype.constructor);
这里我打印了在3种不一样状况下所输出的constructor构造函数属性的内容,我将谷歌浏览器控制台打印出的结果截图以下:
是的正如咱们看见的为何console.info(myfile1.constructor);打印出的结果与console.info(myfile.prototype.constructor);打印出的结果会是同样的,而console.info(myfile.constructor);打印出的结果倒是ƒ
Function() { [native code] },其实这个很好理解,若是你看了个人上一章讲解的javascript面向对象——prototype属性(原型属性)那么我相信这个地方就会很容易理解,其实咱们首先要清楚constructor构造函数属性,它是谁的属性?它是原型属性prototype所指向的那个对象的属性。那么在这个对象中这个属性它又指向谁呢!?它指向的是构造函数也就是上面代码中的function
myfile(name,age){this.webname = name; this.age = age;}这一部分,其值就是这个构造函数中的对象。
那么确定会有人疑问,既然
constructor构造函数属性 指向的是是构造函数,那么打印出的结果是构造函数这个能够理解可是为何console.info(myfile.prototype.constructor);打印的也是构造函数呢!?它指向的可不是构造函数,是的咱们知道实例化对象指向的一直都是prototype原型属性所指向的对象。若是想解决这个问题,那么咱们首先应该弄明白两个问题。
一、实例化对象到底指向的是谁?
二、实例化对象到底继承的是谁?
首先咱们仍是用一个实例来引入,用图片看结果真后在总结:
代码部分:
function myfile(name,age){
this.webname = name;
this.age = age;
}
myfile.prototype.getname = function () {
return this.age;
}
var myfile1 = new myfile("zhang",3);
console.info(myfile1.constructor);
打印结果图片以下:
总结:代码执行的结果在控制台上显示的内容如上图,打印出的是构造函数的代码也就是代码部分
function myfile(name,age){
this.webname = name;
this.age = age;
}
的的内容,有人确定会想,哎!!!这不很明显嘛,实例化对象指向的就是构造函数啊!继承的也是构造函数。
那么咱们来运行另一句代码:console.info(myfile1.getname());打印出的结果倒是3。
什么状况在上面的构造函数中并无getname()这个函数对象啊!为何会打印出结果3呢!咱们能够仔细看看getname()这个对象是在什么地方出现的,是的它是经过原型属性直接定义的,经过上面的两次打印咱们能够很明显的发现实例化对象不只可以打印出构造函数还可以打印出经过原型链来建立的属性以及属性值,换句话说,也就是实力化的对象继承的对象并不全是构造函数,而是指向了一个咱们看不见的对象,这个对象里面包含的有构造函数,还有经过原型链来建立的属性,那么这个对象是什么呢!其实咱们在建立构造函数的时候,每一个构造函数都会有一个prototype原型属性,这个原型属性会指向一个咱们看不见的对象,咱们能够经过原型属性来建立固定不变的属性并赋值,如:myfile.prototype.getname
= function () {return this.age;}这个时候原型属性所指向的对象不只包含了构造函数还包含了经过原型属性所建立出来的一些属性。
上面两个问题的答案就出来了:
一、实例化对象到底指向的是谁?
答:实例化对象指向的永远是prototype原型属性所指向的那个对象,是经过实例化对象的内部属性[[prototype]]来实现的。
二、实例化对象到底继承的是谁?
答:其实实例化对象继承的仍是prototype原型所指向的那个虚拟的对象。
总结constructor(构造函数属性):
这个时候咱们在来看看 console.info(myfile1.constructor); console.info(myfile.constructor);
console.info(myfile.prototype.constructor);三个为何第一个跟第三个的值是同样的可是第二个会出现
ƒ Function() { [native code] } 。
console.info(myfile.prototype.constructor);其实就是在告诉计算机咱们要的结果是prototype原型属性所指向的那个对象中的构造函数,而由于console.info(myfile1.constructor);原本就是直接继承的就是prototype原型属性所指的对象因此这两个命令打印出的结果天然也都是来之那个虚拟的对象中,这就是为何这两个代码所执行出来的结果是同样的缘由。至于console.info(myfile.constructor);执行出来的结果是ƒ
Function() { [native code] } 就更好理解了,native code
的意思就是 本机代码 其实意思就是告诉咱们,咱们所执行的console.info(myfile.constructor);代码就是构造函数它本身自己,不能所执行这条代码会报错,只是控制台会更智能一些的告诉咱们,咱们须要打印的就是它本身而已。
如今你知道了constructor构造函数属性是属于谁的属性吗?
答:
一、它是prototype原型属性所指向的那个虚拟对象的属性。
二、它是实例化对象的属性。