什么是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原型属性所指向的对象。如果想解决这个问题,那么我们首先应该弄明白两个问题。
1、实例化对象到底指向的是谁?
2、实例化对象到底继承的是谁?
首先我们还是用一个实例来引入,用图片看结果然后在总结:
代码部分:

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;}这个时候原型属性所指向的对象不仅包含了构造函数还包含了通过原型属性所创建出来的一些属性。
上面两个问题的答案就出来了:
1、实例化对象到底指向的是谁?
答:实例化对象指向的永远是prototype原型属性所指向的那个对象,是通过实例化对象的内部属性[[prototype]]来实现的。
2、实例化对象到底继承的是谁?
答:其实实例化对象继承的还是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构造函数属性是属于谁的属性吗?
答:
1、它是prototype原型属性所指向的那个虚拟对象的属性。
2、它是实例化对象的属性。
从上面的例子中我们也能推断出上面的两条答案是成立的。
--------------------- 
作者:待归魔帝 
来源:CSDN 
原文:https://blog.csdn.net/zhj145236/article/details/77477057 
版权声明:本文为博主原创文章,转载请附上博文链接!

面向对象object与constructor的更多相关文章

  1. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  2. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

  3. Java面向对象 Object类 内部类

     Java面向对象 Object类    内部类 知识概要:                 一:Object类                 二:内部类 匿名内部类的写法 1.Object O ...

  4. ABAP 面向对象(Object Orientation) OO

    [转自 http://blog.sina.com.cn/s/blog_7c7b16000101bhof.html]在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和 ...

  5. Object.prototype.constructor

    Returns a reference to the Object function that created the instance's prototype. 注意这个属性的值是函数本省的引用,而 ...

  6. 面向对象-Object类

    一.Object类中的equals()方法 equals(Object obj) :指示其它某个对象是否与此对象"相等". 返回值类型是boolean Oblect类中的equal ...

  7. php面向对象Object

    1.创建类 class 类名{ private 私有变量 只能本类的内部使用 protected 受保护的变量 本类和子类的内部 public 公开的变量 都可以使用 一般属性都设为私有 一般函数都是 ...

  8. The comparison between object and constructor

    1.相似的地方 1.举个栗子:public struct Student{    string name;    int age;}public class bike{    int weight;  ...

  9. Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...

随机推荐

  1. Flutter(一)安装配置和几个注意点

    Flutter(一)安装配置和几个注意点 记住要仰望星空,不要低头看脚下.无论生活如何艰难,请保持一颗好奇心.你总会找到自己的路和属于你的成功. 愿您的来世灵魂依旧,躯体康健. 一句话来形容Flutt ...

  2. 201621123075《Java程序设计》第1周学习总结

    1.本周学习总结 本周简单了解了一些Java的基本概念,如Java的用途,功能.也学习了一些变量,类型和运算符.我感觉学好Java也是不容易的,尽管它库函数丰富,可最重要的还是那一份创造力. 2.书面 ...

  3. java项目改为web项目

     1.进入项目目录,可看到.project文件,打开. 2.找到<natures...</natures代码段. 3.在第2步的代码段中加入如下标签内容并保存: <nature& ...

  4. 阶段01Java基础day16集合框架02

    16.01_集合框架(去除ArrayList中重复字符串元素方式1) A:案例演示 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 思路:创建新集合方式 /** * A:案例演示 ...

  5. Centos下软件包管理

    目录 一.安装软件包的三种方法 二.rpm包介绍 三.rpm工具用法 四.yum工具用法 五.yum搭建本地仓库 六.yum更换国内源 七.yum下载rpm包 八.源码包安装 九.扩展 一.安装软件包 ...

  6. 如何在QFileSystemModel中显示文件夹的大小

    在Qt里面,有一种Model/View框架,Model负责收集信息,View负责显示信息.QFileSystemModel可以读取文件大小,但是默认情况下不能读取文件夹大小. QFileSystemM ...

  7. 外网ssh内网Linux服务器holer实现

    外网ssh访问内网linux 内网的主机上安装了Linux系统,只能在局域网内访问,怎样从公网也能ssh访问本地Linux服务器? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安 ...

  8. 根据ip获取地理信息

    function getIPLoc_sina($queryIP){    $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?form ...

  9. 如何用Caffe训练自己的网络-探索与试验

    现在一直都是用Caffe在跑别人写好的网络,如何运行自定义的网络和图片,是接下来要学习的一点. 1. 使用Caffe中自带的网络模型来运行自己的数据集 参考 [1] :http://www.cnblo ...

  10. jQuery ajax瀑布流加载静态的列表页面

    1.加载一行数据 <script> //滚动加载事件 var Loadurl = "{$url}"; if(window.location.href !== Loadu ...