竞技宝竞猜javascript 静态对象和构造函数的行使和公共难点_javascript技能_脚本之家

2019-11-26 16:07栏目:竞技宝竞猜
TAG:

先看: 复制代码 代码如下: var objJson={ op1:'objJson option1', fn1:function } } 在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。但是如果是这样: 复制代码 代码如下: var objFn=function(){ this.op1='objFn.op1'; this.op2=function }; } 那么如果你直接objFn.op1或者objFn.op2()来访问内部的属性的话,就不行了,因为这个时候他还不是个对象。 所以我们需要将他实例化 复制代码 代码如下: var inst=new objFn; inst.op2(); 这样就可以得到你想要的值了。 如果你想复制JSON形式的对象,很简单,但是有一个问题: 复制代码 代码如下: var newone=objJson; newone.op1='changed'; alert; 你会发现原来的对象中的op1的值也发生了改变。但是如果使用的第二种的对象声明的办法,那么修改只是在实例的内部,不会影响其他的实例。 所以像JSON这样的静态对象适合在写一些常用的库的时候使用,有他自己的命名空间,谁也不会干扰到谁,而且方便使用。 构造函数的"公有""私有"属性 我们将上面的构造函数做一个修改: 复制代码 代码如下: var objFn=function(){ var pri1='私有变量'; this.op1='公共变量'; this.op2=function(){ alert; }; }; var o=new objFn(); alert(typeof o.pri1+','+typeof o.op1);//undefined,string o.op2();//私有变量,公共变量 私有变量在对象外是不允许访问的,所有typeof以后是undefined。下面我们看看私有方法的访问: 复制代码 代码如下: var objFn=function(){ var pri1='私有变量'; var pri2=function; }; this.op1='公共变量'; this.op2=function(){ alert; }; this.acPri=function; }; }; var o=new objFn;//私有变量,公共变量 注意到这里因为JavaScript的闭包特性,我们通过公有方法acPri()调用私有方法pri2的时候需要使用call将程序的上下文传递进去,不过就是这个看起来绕来绕去的太晕,可以稍稍的包装一下: 复制代码 代码如下: var objFn=function(){ var my=this; var pri1='私有变量'; var pri2=function; }; this.op1='公共变量'; this.op2=function(){ alert; }; this.acPri=function; }; }; var o=new objFn;//私有变量,公共变量 当然最后的结果还是不变。 转载请保留以下信息 作者:北玉

用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了,最近看了一些 JavaScript高级程序设计,终于揭开了其神秘面纱。

每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。

私有变量、函数

在具体说prototype前说几个相关的东东,可以更好的理解prototype的设计意图。之前写的一篇JavaScript 命名空间文章中提到过JavaScript的函数作用域,在函数内定义的变量和函数如果不对外提供接口,那么外部将无法访问到,也就是变为私有变量和私有函数。

复制代码 代码如下:

function Obj(){
                var a=0; //私有变量
                var fn=function(){ //私有函数

                }
            }

这样在函数对象Obj外部无法访问变量a和函数fn,它们就变成私有的,只能在Obj内部使用,即使是函数Obj的实例仍然无法访问这些变量和函数

复制代码 代码如下:

var o=new Obj();
            console.log(o.a); //undefined
            console.log(o.fn); //undefined

静态变量、函数

当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java、C#的同学很好理解静态的含义。

复制代码 代码如下:

function Obj(){

            }

            Obj.a=0; //静态变量

            Obj.fn=function(){ //静态函数

            }

            console.log(Obj.a); //0
            console.log(typeof Obj.fn); //function

            var o=new Obj();
            console.log(o.a); //undefined
            console.log(typeof o.fn); //undefined

实例变量、函数

在面向对象编程中除了一些库函数我们还是希望在对象定义的时候同时定义一些属性和方法,实例化后可以访问,JavaScript也能做到这样

复制代码 代码如下:

function Obj(){
                this.a=[]; //实例变量
                this.fn=function(){ //实例方法

                }
            }

            console.log(typeof Obj.a); //undefined
            console.log(typeof Obj.fn); //undefined

            var o=new Obj();
            console.log(typeof o.a); //object
            console.log(typeof o.fn); //function

这样可以达到上述目的,然而

复制代码 代码如下:

function Obj(){
                this.a=[]; //实例变量
                this.fn=function(){ //实例方法

                }
            }

            var o1=new Obj();
            o1.a.push(1);
            o1.fn={};
            console.log(o1.a); //[1]
            console.log(typeof o1.fn); //object
            var o2=new Obj();
            console.log(o2.a); //[]
            console.log(typeof o2.fn); //function

上面的代码运行结果完全符合预期,但同时也说明一个问题,在o1中修改了a和fn,而在o2中没有改变,由于数组和函数都是对象,是引用类型,这就说明o1中的属性和方法与o2中的属性与方法虽然同名但却不是一个引用,而是对Obj对象定义的属性和方法的一个复制。

这个对属性来说没有什么问题,但是对于方法来说问题就很大了,因为方法都是在做完全一样的功能,但是却又两份复制,如果一个函数对象有上千和实例方法,那么它的每个实例都要保持一份上千个方法的复制,这显然是不科学的,这可肿么办呢,prototype应运而生。

prototype

版权声明:本文由龙竞技官网发布于竞技宝竞猜,转载请注明出处:竞技宝竞猜javascript 静态对象和构造函数的行使和公共难点_javascript技能_脚本之家