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 = 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_