zoukankan      html  css  js  c++  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 = 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_

  • 相关阅读:
    winform笔记
    深度GHOST安装,GHOST完毕后不能启动继续
    CSS+JS;JS+CSS换肤总结
    windows2008配置来
    ul li做标题列表中间出现多的一个空行,重复。
    洛谷P3376 【模板】网络最大流
    洛谷P3387 【模板】缩点
    洛谷P3796 【模板】AC自动机(加强版)
    洛谷P3384 【模板】树链剖分
    洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/dangkei/p/4866680.html
Copyright © 2011-2022 走看看