`
tyny
  • 浏览: 74456 次
  • 性别: Icon_minigender_1
  • 来自: 黄冈
社区版块
存档分类
最新评论

javascript 构造函数续

阅读更多

 

上一节提到过,通过new新建的对象的构造函数其实是该对象原型所指向的构造函数,但是不是所有的原型都有构造函数,??,通过观察比较发现,一般情况下,通过new新建的对象是没有构造函数的,在Chrome和Opera浏览器里面可以直接查看到对象是没有constructor这个属性的,奇怪不?但是实际如此(之前我还一直才猜测,但是实际上,通过new新建的对象自身是没有constructor属性的,可以通过Object.getOwnPropertyNames查看)。也就是对象的constructor属性其实是对象的原型链从对象出发向上,找到最近的有constructor的原型对象,然后这个constructor就是该对象的constructor。看看这块代码

 

function A() { this.name="A";}
function B() { this.name="B";}
function C() { this.name="C";}
B.prototype = new A();
C.prototype = new B();
var a = new A();
var b = new B();
var c = new C();
console.log(a.constructor); //A()
console.log(b.constructor); //A()
console.log(c.constructor); //A()

 图1


为啥他们的构造函数都是A,顺着a,b,c的原型链(绿色)找,你会发现离对象最近的A.prototype有constructor属性,可能有人会问a,b,c的构造函数去那呢?上面已经强调过,正常情况下,他们本身没有constructor属性的,之所以c.constructor等有值,他是从他的原型链中找到的——即对象的原型链中离对象最近的有constructor属性的原型对象的构造函数。下面会证实这点在看看这段代码

 

function A() { this.name="A";}
function B() { this.name="B";}
function C() { this.name="C";}
function A1(){ this.name="A1";}

B.prototype = new A();
C.prototype = new B();
B.prototype.constructor=A1;

console.log((new A()).constructor); //A()
console.log((new B()).constructor); //A1()
console.log((new C()).constructor); //A1() 

  

 图2

可以发现通过B和C新建的对象的构造函数就是A1,其实就是绿色的原型链中最近的有constructor属性的原型对象的构造函数。这样可以解释很多构造函数方面的问题。

还有一个问题需要确认,如果是顺着原型链来确认构造函数,那个最终构造函数就是A

 

function A() { this.name="A";}
function B() { this.name="B";}
function C() { this.name="C";}
B.prototype = new A();
C.prototype = new B();
(new C()).constructor.tname='gui';
console.log(A.tname);//gui 

 没错,(new C()).constructor就是A,这个不用怀疑,不然那个"gui"从哪来的呢。


  • 大小: 33.1 KB
  • 大小: 37.1 KB
分享到:
评论

相关推荐

    如何编写高质量JS代码(续)

    函数可以独立实现其他语言中的多个不同的特性,例如,过程、方法、构造函数,甚至类或模块。 2.1 理解函数调用、方法调用以及构造函数调用之间的不同 针对面向对象编程,函数、方法和类的构造函数是三种不同的概念。...

    C#基类库(苏飞版)

    构造函数2.私有字段3.设置字体4.设置页面大小 5.实例化文档6.打开文档对象7.关闭打开的文档8.添加段落9.添加图片10.添加链接、点 等功能 10.ResourceManager 操作类 AppMessage app消息格式化类,返加字符串帮助类...

    C#基础类库

    构造函数2.私有字段3.设置字体4.设置页面大小 5.实例化文档6.打开文档对象7.关闭打开的文档8.添加段落9.添加图片10.添加链接、点 等功能 10.ResourceManager 操作类 AppMessage app消息格式化类,返加字符串帮助类...

    asp.net知识库

    静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何...

    JAVA上百实例源码以及开源项目

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

    JAVA上百实例源码以及开源项目源代码

    JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很...

    python入门到高级全栈工程师培训 第3期 附课件代码

    python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 ...15 再插两道JavaScript面试题 16 Model操作之select_related以及...

    java源码包---java 源码 大量 实例

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器...

    java源码包2

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML...

    java源码包3

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML...

    java源码包4

    JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很...

Global site tag (gtag.js) - Google Analytics