狮子座男

导航

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_

 

posted on 2015-10-10 14:06  狮子座男  阅读(429)  评论(0编辑  收藏  举报