用了javascript这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚.
注释中对象只例子的对象本身,原型只原型继承对象的新对象.
1 /** 2 * Created by Feng Huang on 10/10/2015. 3 */ 4 5 function Obj(arg){ 6 var a = arg; //对象的私有变量 对象和原型都不能访问 7 var fn = function(){}; //对象的私有函数 对象和原型都不能调用 8 9 this.b = arg; //原型的公有变量 原型能访问对象自己不能访问 [这种其实很容易理解出错的. 对象本身竟然不能调用但原型却可以.] 一直以为这种是对象自己也是可以调用的属性 10 this.fn1 = function(){}; //原型的公有函数 原型能调用对象自己不能访问 11 } 12 13 Obj.c = 1; //对象的公有变量 对象能访问原型不能 14 Obj.fn2 = function(){}; //对象的公有函数 对象能调用原型不能 15 16 Obj.prototype.d = 11; //原型的属性 对象本身访问不到 17 Obj.prototype.fn3 = function(){}; //原型的方法 对象本身访问不到 18 19 20 console.log("Obj.a = "+Obj.a); 21 console.log("Obj.fn = "+Obj.fn); 22 console.log("Obj.b = "+ Obj.b); 23 console.log("Obj.fn1 = "+ Obj.fn1); 24 console.log("Obj.c = "+ Obj.c); 25 console.log("Obj.fn2 = "+Obj.fn2); 26 console.log("Obj.d = "+ Obj.d); 27 console.log("Obj.fn3 = "+Obj.fn3); 28 29 console.log("--------------------------------------"); 30 31 var A = new Obj(22); 32 console.log("A.a = "+A.a); 33 console.log("A.fn = " +A.fn); 34 console.log("A.b = "+ A.b); 35 console.log("A.fn1 = "+A.fn1); 36 console.log("A.c = "+A.c); 37 console.log("A.fn2 = "+A.fn2); 38 console.log("A.d = "+A.d); 39 console.log("A.fn3 = "+A.fn3);
结果==>
Obj.a = undefined Obj.fn = undefined Obj.b = undefined Obj.fn1 = undefined Obj.c = 1 Obj.fn2 = function (){} Obj.d = undefined Obj.fn3 = undefined -------------------------------------- A.a = undefined A.fn = undefined A.b = 22 A.fn1 = function (){} A.c = undefined A.fn2 = undefined A.d = 11 A.fn3 = function (){}
总结:
第一种方式
function Obj(arg){ var a = arg; //对象的私有变量 对象和原型都不能访问 var fn = function(){}; //对象的私有函数 对象和原型都不能调用 }
声明后 不管对象本身还是原型继承对象后的子类都没办法直接访问.
**************************************************************
第二种方式
function Obj(arg){ this.a = arg; //对象的私有变量 对象和原型都不能访问 this.fn = function(){}; //对象的私有函数 对象和原型都不能调用 }
第四种方式
function Obj(arg){ } Obj.prototype.d = 11; //原型的属性 对象本身访问不到 Obj.prototype.fn3 = function(){}; //原型的方法 对象本身访问不到
第二和第四种方式放在一起都是原型继承对象后的子类可以访问到,但是原对象本身访问不到.
*****************************************************************
第三种方式
function Obj(arg){ } Obj.c = 1; //对象的公有变量 对象能访问原型不能 Obj.fn2 = function(){}; //对象的公有函数 对象能调用原型不能
对象本身扩展后方法和属性,继承对象后的原型访问不到.
第1,3,4种方法很好理解. 第2种方法对象本身不能直接访问闭包内的变量能够理解. 但是使用关键字this后继承对象的原型就可以调用这些属性和方法值得深入研究. 关键字this的特性.
this是指向对象原型new之后新创建的对象而不是对象自己本身. this === new self() === _proto_