javascript对象的属性,方法,prototype作用范围分析.

时间:2021-07-13 18:48:57

用了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_