javascript new运算符

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>new.html</title>
	
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
	<script type="text/javascript" src="../js/jquery-1.11.3.js"></script>

  </head>
  
  <body>
	<div id="div"></div>
	<script type="text/javascript">
	// <![CDATA[
		var global = this;
		function show(str) {
			$("#div").append($("<p></p>").text("" + str));
		}
		
		//javascript是基于原型(Prototype based)的面向对象的语言
		//只有带有this关键字的构造函数function才需要用到new来生成对象,new生成的实例通过__proto__属性指向原型对象,其他情况通常用字面量{}。
		
		//无论什么时候,只要声明一个新函数,就会根据一组特定的规则为该构造函数自动创建一个prototype属性,这个属性指向构造函数的原型对象。
		//在默认情况下,所有原型对象都会自动获得一个prototype.constructor(构造函数)属性,
		//这个属性constructor包含一个指向 prototype 属性所在构造函数的指针。而通过prototype属性,可以继续为原型对象添加其他属性和方法。
		//创建了自定义的构造函数后,其原型对象默认只会取得 constructor 属性;至于其他方法,则都从 Object 继承而来。
		//当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(__proto__),指向构造函数的原型对象。
		//ECMA-262第5版管这个指针叫 [[Prototype]] 。脚本中没有标准的方式访问 [[Prototype]],
		//但Firefox、Safari和Chrome在每个对象上都支持一个属性__proto__;而在其他实现中,这个属性对脚本是完全不可见的。
		//不过,要明确的真正重要的一点就是,这个连接存在于实例和构造函数的原型对象之间,而不是存在于实例和构造函数之间。 
		//instanceof通过判断prototype是否在同一条原型链上。
	
		//此自定义构造函数会自动创建一个指向原型对象的prototype属性,默认是new Object对象。
		//原型对象则自动获得一个construtor属性,这个属性指向自定义构造函数employee。
		function Employee() {
		      this.name = "name";
		      this.dept = "dept";
		}
		show(Employee.prototype.constructor == Employee);	//true
		show(Employee.prototype instanceof Object);			//true
		//改变自定义构造函数的原型对象时,新原型对象的construtor属性不再是employee
		Employee.prototype = {
	    	say : "hello",
	    	sayHello : function() {
	    					show(this.say);}
		};
		show(Employee.prototype.constructor == Employee);	//false
		//此处需要手动设置新原型对象的constructor为自定义构造函数
		Employee.prototype.constructor = Employee;
		//此处p新建了一个空对象并复制了employee构造函数中的this属性,获得一个属性p.__proto__指向原型对象
		var p = new Employee();
		//当对象查找某一成员变量时,首先查找自己的成员属性,如果找到了,返回值。
		//如果没找到,就去调用__proto__来检查原型链,会从原型链中查找向上进行查找,未查到则返回undefined
		p.sayHello();		//hello
		
		//我们可以这样理解javascript中用new操作创建实例的过程:
		//new关键字以employee()为模板创建了一个新的空对象{},它复制了employee构造器中的this成员变量,
		//也可以理解为,将p对象作为参数传入构造函数中,并且应用函数中所有this的成员变量,
		//同时继承了构造器的原型对象,使用obj.__proto__属性指向原型链。
		//用代码模拟new的过程:
		//var p = new Object() is also correct.
		var p1 = {};
		Employee.apply(p1);
		p1.__proto__ = Employee.prototype;
		p1.sayHello();		//hello
		
	// ]]>
	</script>
  </body>
</html>

相关推荐