javascript基础之八(原型揭秘)
2015-10-23 20:57
579 查看
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>8-JavaScript原型揭秘</title> </head> <script> var obj={ func:function(){ console.info("hello"); } }; //对象的原型 console.info(obj.toString()); console.info(obj.__proto__); console.info(obj.__proto__===Object.prototype);//true //对象原型总结 //使用对象字面量(或者使用new Object(),再添加成员)创建对象时,每个对象都包含一个原型对象(prototype object),通过一个__proto__可以引用到这个原型对象,特别地,这个原型对象与Object引用的原型对象Object.prototype时同一个 //自定义函数的原型 console.info(obj.func.__proto__); console.info(obj.func.__proto__===Function.prototype);//true console.info(obj.func.prototype); console.info(obj.func.prototype.__proto__===Object.prototype);//true console.info(obj.func.prototype.constructor===obj.func);//true console.info(obj.func.prototype.constructor.toString()); //自定义函数的原型小结 /*自定义函数的原型prototype属性应用的是一个对象,其prototype属性引用的又引用了这个函数对象,当函数作为对象的构造函数的时候,则构造出来的对象的prototype属性引用的对象就是原构造函数对象;构造函数的__proto__属性引用一个Empty()对象(也就是Function.prototype)*/ //构造函数的原型 var Myobject=function(){ this.info="通过构造函数创建对象"; }; var myObj=new Myobject(); console.info(myObj.prototype);//undefined console.info(myObj.__proto__);//Myobject console.info(myObj.__proto__.constructor.toString()); console.info(myObj.__proto__.constructor==Myobject); console.info(myObj.__proto__===Myobject.prototype); console.info(Myobject.prototype); //通过原型构造对象 console.info("通过原型构造对象"); function MyObject(name){ this.name=name; } var obj= new MyObject("object1"); for(var proName in obj){//遍历obj中所有的属性 console.info("obj[\"" +proName+"\"]:"+obj[proName]); } //修改原型,向它添加成员 MyObject.prototype.value=100; MyObject.prototype.print=function(){ console.info(this.name,this.value); }; console.info("修改原型后"); for(var protoName in obj){ console.info("obj[\"" +proName+"\"]:"+obj[proName]);//修改原型后,原型中的成员将自动加入到构造出来的对象之中 } obj.name="newname";//这些属性同样可以使用 obj.value++; obj.print(); //原型和原型中定义的方法,被所有对象共享 var obj2=new MyObject("object2"); console.info(obj.prototype===obj2.prototype);//ture console.info(obj.print===obj2.print);//ture //原型的小结 /* 每个对象都连接到一个原型对象(通过__proto__),这个原型对象要要么是Object.prototype,或者是它构造函数所对应的原型对象 如果我们天界一个新的属性到原型中,该属性立即成为所有对象的属性,不管是已经创建的还是新创建的 原型和原型中定义的属性以及方法,被所有对象共享 */ /* 通过原型和构造函数添加的属性和方法的区别: 通过原型添加,新加的属性和方法为所有对象共享,每个对象对应属性值相同 通过构造函数添加,新加的属性和方法仅归于单个对象,每个对象的属性值不同 */ //当有同名变量时候 function Person(){}; Person.prototype.name="PersonName"; Person.prototype.age=26; Person.prototype.sayName=function(){console.info(this.name);}; var p1=new Person(); p1.name="张三"; var p2=new Person(); console.info(p1.name);//张三:优先访问自己定义的属性,prototype为其原型 console.info(p2.name);//PersonName:次值来自原型对象 //对象创建推荐的方式 function Myperson(name,age,job){ this.name=name; this.age=age; this.job=job; this.friends=[];//构造函数中定义的成员在每个对象中是私有的(值不同) } Myperson.prototype={//定义原型,原型中的成员所有创建的对象共享(值相同) constructor:Person, sayName:function(){ console.info(this.name); } } </script> <body> </body> </html>
4000
相关文章推荐
- Jsp标准标签库JSTL
- Jsp验证码
- js拖拽功能
- JSP 九大内置对象详解
- javascript基础之七(函数闭包中this的变化)
- 用JS写的简单的猜数的游戏,一个是步数限制的,一个是有时间限制的。
- CommonJs AMD CMD 模块加载
- javascript基础之六(函数的闭包)
- javascript基础之五(this与闭包详解)
- seajs3.0.0源码分析记录
- JS播放声音 兼容所有浏览器
- javascript基础之四(数组详解)
- javascript基础之三(对象详解)
- jsp文件开头<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 > 有什么用
- javascript基础之二(变量作用域的各种啃)
- javascript基础之一(函数)
- javascript基础一(变量与函数)
- 轻松学习JavaScript二:JavaScript语言的基本语法要求
- JS Replace全部替换字符方法
- js动态生成选项之考试系统(一)