一直都不理解javascript中的prototype是什么意思,自从看了dolphinx的博客(http://www.cnblogs.com/dolphinX/p/3286177.html)才对它有了大体的认识。
每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。
在javascript中创建对象有多种方法
1.直接创建一个对象的实例,并添加3个属性。
var obj =new Object(); obj.name="test"; obj.sex="male"; obj.age=50;
2.利用function定义对象的模板
function person(name,sex,age){ this.name=name; this.sex=sex; this.age=age; } //这时你就可以创建实例 var person=new person("test","male","50");
在函数中定义的属性和方法如果不对外提供接口的话,那么外部将无法访问到。
function Obj(){ var a=0; //私有变量 var fn=function(){ //私有函数 } } var o=new Obj(); console.log(o.a); //undefined console.log(o.fn); //undefined
这时就需要定义实例方法和实例变量了
function Obj(){ this.a=[]; //实例变量 this.fn=function(){ //实例方法 } } console.log(typeof Obj.a); //undefined console.log(typeof Obj.fn); //undefined var o=new Obj(); console.log(typeof o.a); //object console.log(typeof o.fn); //function
但你每new一个新的对象,虽然调用同名方法但引用的对象去不是同一个,这时就需要prototype了
Blog.prototype.jumpurl = ‘‘; Blog.prototype.jump = function(){ window.location = this.jumpurl; }; /* *等同于 Blog.prototype = { jumpurl : ‘‘, jump : function(){ window.location = this.jumpurl; } }; */var test = new Blog(‘server‘, ‘test‘);
Blog的实例test中包含了jump属性,同时自动生成一个__proto__属性,该属性指向Blog的prototype,可以访问到prototype内定义的jumpurl方法,这时属性和方法就是共享的了。