一:区别
__proto__是所有对象(包括函数都有的);
prototype只有函数有;
二:原型链是什么?
原型链是针对构造函数的。通过new 创建函数,new出来的函数就会继承创建他的函数的属性。如果访问new函数的某个未在当前函数中定义的变量,他就会往上查找(像创建他的函数),这个查找的过程就教做原型链;
例:
var Person=function(){
Person.prototype.say=function(){
alert('hello word!')
}
};
var p = new Person();
p.say(); //alert('hello word!')
三:说明 prototype与proto的关系
var Person=function(){ };
var p = new Person();
看看new 做了什么??
var p={ }; //第一步:创建一个对象
p.proto=Person.prototype;//第二步
Person.call( p );//第三步:构造p(初始化p);
验证下第二步
var Person=function(){ };
var p = new Person();
console.log(p.proto=Person.prototype) // true
例子:
var
Person =
function
() {};
Person.prototype. alert= function () {
alert ( "Person alert" );
}
Person.prototype. time= 50000;
var Programmer = function () {};
Programmer.prototype = new Person ();
//var p1=new Person();Programmer.prototype=p1
//p1.__proto__=Person.prototype;
//Programmer.prototype.__proto__=Person.prototype;
Programmer.prototype.prompt = function () {
alert ( "programmer prompt something" );
};
Programmer.prototype. time= 500;
var p = new Programmer (); //p.__proto__=Programmer.prototype;
p. alert (); // alert("Person alert");
p. prompt (); // alert("programmer prompt something");
alert (p. time ); //500
//根据上面得到p.__proto__=Programmer.prototype。
//得到p.__proto__.__proto__=Person.prototype。
Person.prototype. alert= function () {
alert ( "Person alert" );
}
Person.prototype. time= 50000;
var Programmer = function () {};
Programmer.prototype = new Person ();
//var p1=new Person();Programmer.prototype=p1
//p1.__proto__=Person.prototype;
//Programmer.prototype.__proto__=Person.prototype;
Programmer.prototype.prompt = function () {
alert ( "programmer prompt something" );
};
Programmer.prototype. time= 500;
var p = new Programmer (); //p.__proto__=Programmer.prototype;
p. alert (); // alert("Person alert");
p. prompt (); // alert("programmer prompt something");
alert (p. time ); //500
//根据上面得到p.__proto__=Programmer.prototype。
//得到p.__proto__.__proto__=Person.prototype。
//其实prototype只是一个假象,他在实现原型链中只是起到了一个辅助作用,原型链的本质,其实在于__proto__
例图:引用至:(找不到了原作者,下回找到原作者给补上)
四:使用场景
prototype:写一个js类,需要继承的你都放这个属性下
__proto__你基本不会去用,js引擎实现原型链用的,原型链看上面。
五:对象使用prototype的好处
1)不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!
2)使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!
2)使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!
参考文件:
http://rockyuse.iteye.com/blog/1426510