JavaScript解释器是如何创建对象的

JavaScript创建对象的内部机制
服务器君一共花费了233.749 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

Javascript中可以使用new操作符来创建一个对象,那么系统是如何使用new操作符来创建对象的呢?我们来看下流程:

  1. 首先需要定义一个类。
  2. 使用new操作符紧跟你所定义的函数来创建一个新的类的实例。
  3. 一旦Javascript编译器碰到了new操作符,它就创建了一个空的实例变量,将类中prototype的所有属性和方法复制到这个实例中,并将成员函数中所有的this指向这个新创建的实例。
  4. 接下来,执行紧跟在new操作符后面的那个函数。
  5. 当你执行完这个函数时,如果你试图对一个不存在的属性进行赋值,Javascript编译器将自动为你在这个范围内新创建这个属性。
  6. 函数执行完毕后,将这个初始化完成的实例返回。

也就说:

JavaScript实际上在使用new时,执行了下列三个过程:

  1. 创建空对象。
  2. 将类的prototype中的属性和方法复制到实例中。
  3. 将第一步创建的空对象做为类的参数调用类的构造函数。

模拟new

描述:创建一个类person,然后创建两个变量p1和p,比较两个变量最终生成的结果。

<script type="text/javascript">
function person(name,age)
{
	this.name=name;
	this.age=age;
}
        
person.prototype = {
	ShowName:function(){
		alert(this.name);
	},
	ShowAge:function(){
		alert(this.age);
	}
}
        
var p1= new person("ss",20);
        
var p = {};
for(var v in person.prototype)
{
	p[v]=person.prototype[v];
}        
        
person.call(p,"www",'29');
        
p.ShowName();
</script>

重载

描述:定义类person.person类构造函数中有个ShowName方法,person.prototype上有个ShowName方法。实例究竟调用的是哪个方法呢?

答:调用的person类内部的ShowName方法。

定义类person如下:

function person(name,age)
{
	this.name=name;
	this.age=age;
	this.ShowName=function(){
		alert("这是构造函数中的ShowName:"+this.name);
	}
}
        
person.prototype={
	ShowName:function(){
		alert("这是Prototype中的ShowName:"+this.name);
	},
	ShowAge:function(){
		alert(this.age);
	}
}

实例化过程:

var p = {};
        
for(var v in person.prototype){
	p[v]=person.prototype[v];
}        
        
//执行完for语句,p已经具备了ShowName方法.可取消下述注释,测试结果
//执行输出:
//这是Prototype中的ShowName:undefined
//p.ShowName();
        
//因为person函数中存在下列代码:
//this.ShowName={}
//所以执行完此函数后
//变量p的ShowName变量被重新指向新的函数.原来的指向无处可寻
person.call(p,"www",29);
        
//输出:
//这是这是构造函数中的ShowName:www
p.ShowName();

本文地址:http://www.nowamagic.net/librarys/veda/detail/479,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/479

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《链接器和加载器》 莱文(John R.Levine) (作者), 李勇 (译者)

《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟的现代链接器所做的一些变化;并介绍一个持续的实践项目,即使用Perl语言开发一个可用的小链接器。《链接器和加载器》适合高校计算机相关专业的学生、实习程序员、语言设计者和开发人员阅读参考。

更多计算机宝库...