<!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>