你的位置:首页 > Java教程

[Java教程]javascript对象的属性,方法,prototype作用范围分析.


用了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 = undefinedObj.fn = undefinedObj.b = undefinedObj.fn1 = undefinedObj.c = 1Obj.fn2 = function (){}Obj.d = undefinedObj.fn3 = undefined--------------------------------------A.a = undefinedA.fn = undefinedA.b = 22A.fn1 = function (){}A.c = undefinedA.fn2 = undefinedA.d = 11A.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的特性.

如果有能解释原理的朋友解释下不胜感激.