`

转:javascript共有静态方法,私有静态方法,特权方法的区别

 
阅读更多
JavaScript中,每个function都拥有一个原型对象prototype,通过这个对象可以为这个类定义各种属性和方法,但是这样定义的属性和方法是所有该类的对象所共有的,效果上和同这个类的父类中继承的字段和方法差不多。通常我们使用function的原型来创建类的方法,而用普通方式来创建类的属性。
1.为什么不用原型来创建属性
因为原型创建的内容是这个类所有对象所共享的,对于一个属性而言,不同的类的对象的值都不一样。如果使用原型对象来创建对象属性,那么任何一个类的对象修改了自己的某个属性,其他对象的相同属性也会被修改。
这么做的本质是因为:属性是各个对象不同的,要求对象自己保存自己该属性的值,而方法对于所有对象而言都是一样的,没有必要每个对象都保存一个方法,只要由类的原型保存一份,各个对象使用方法的时候调用这些方法就可以了。

2.为什么要用原型来保存方法
因为方法对所有类对象来说都是一样的,如果用传统方式定义,那样每个类的对象被定义的时候,该对象都会保存这个方法的信息,这样会耗
费很多资源。而使用原型来保存,所有的方法都保存在原型中,每个对象需要使用方法的时候就调用原型对象中保存的方法。节省了资源。


在类中定义共享的共有方法,私有静态属性和方法,共有静态属性和方法。
//一种更为合适的公用属性和方法的定义,把共有方法在类第一次调用的时候加到类的原型对象中
        var Book = function(name){
            //公有属性,在构造方法里面来定义,通过this关键字
            this.name = name;
            //第一次执行该对象的构造方法,这个时候执行下面的代码
            //为类的原型对象上定义共有的方法
            //所有该类的对象共享相同的共有对象,减小了内存的消耗
            if (typeof Book._init == "undefined") {//在第一次定义该类对象的时候会成立
                //共有的方法,在原型对象上定义
                Book.prototype.setName = function(nname) {
                    this.name = nname; 
                };
                Book.prototype.getName = function(){
                    return this.name; 
                };
                Book.prototype.getCount = function(){
                    addCount();
                    return count; 
                };
            }
            //类已经被定义过了,以后就不再重新定义原型对象上的方法了
            Book._init = true;
            //利用局部变量来模拟私有静态属性和方法
        //这些局部变量定义出来的方法和属性外界不能直接访问,只能通过公有方法访问,
            var count = 0;
            var addCount = function(){
                count++;
            }
        }; 
        //定义共有静态属性
        Book.staticValue = 10;
        //定义共有的静态方法
        Book.changeValue = function() {
            Book.staticValue++;
        }
对上面类的调用方法
//这个new操作相当于先创建了一个简单对象,调用了类的构造方法         
            var book1 = new Book("AJAX");
            var book2 = new Book("AJAX1");
            alert(book1.getName());
            alert(book2.getName());
            book1.setName("JAVA");
            alert(book1.getName());
            alert(book2.getName());
            alert(book1.getCount());
            alert(book2.getCount());
            alert(book1.getCount());
//共有的静态属性和方法要用类名来调用
            alert(Book.staticValue);
            Book.changeValue();
            alert(Book.staticValue);



定义一个对象,希望这个对象拥有一些自己独享的私有信息
方法:直接定义一个匿名的类
//一个单独的对象,期望拥有一些私有有的信息
           
       下面的方法和上面的起到一样的效果,
            //利用匿名方法直接调用的方式,来实现一个对象拥有私有的信息
            var priObj = (function(name){
                //由于这个变量是在方法内定义的,起到的效果就是私有的
                var priname = name;
                //这个格式要求返回的是一个对象,
                //这个对象要求有getName和setName两个方法
                return {
                    getName:function() {
                        return priname;
                    },
                    setName:function(nname) {
                        priname = nname;
                    }
                };
            })("wang");

下面是上面对象的使用方法     
            //var priObj1=new priObj("a");
            //var priObj2=new priObj("b");
上面的做法是错误的,因为这个priObj已经是个定义好的对象了,在定义匿名类的同时就定义好的,所以不能再这么去new了。
//priObj.priname是私有内容,无法访问
            alert(priObj.priname);
            alert(priObj.getName());
            priObj.setName("Lee");
            alert(priObj.getName());
            alert("");
分享到:
评论

相关推荐

    Javascript 构造函数,公有,私有特权和静态成员定义方法

    本文将详细解释JavaScript中构造函数中公有、私有特权成员以及静态成员的定义和使用方法。 构造函数中的成员可以被分为公有成员和私有成员。公有成员指的是那些可以被对象外部访问的属性和方法,而私有成员则是只能...

    js面向对象之公有、私有、静态属性和方法详解

    在JavaScript面向对象编程中,理解公有属性、私有属性、静态属性以及相应的方法是非常重要的。这些概念有助于我们更好地组织和封装代码,实现更高效的代码复用以及更严格的访问控制。 公有属性和公有方法 公有属性...

    JavaScript中的公有、私有、特权和静态成员用法分析

    在JavaScript编程语言中,公有、私有、特权和静态成员的使用是面向对象编程范式的一部分。它们各自有不同的作用域和访问方式,为对象的设计和行为提供了多样化的手段。下面,我们将详细分析这些成员的不同特点和使用...

    浅谈js继承的实现及公有、私有、静态方法的书写

    return pname + "私有属性+公有属性" + this.name + "调用类的共有方法"; }; ``` **私有方法和属性**: 在JavaScript中,没有真正的私有属性或方法,但可以通过闭包来模拟。在`parent`构造函数中,`pname`变量和`...

    JavaScript核心及实践

    - **动态网页**: JavaScript最初设计用来增强网页的交互性,使其从静态内容转变成动态网页。 - **浏览器之战**: 浏览器厂商之间的竞争推动了JavaScript技术的快速发展。 - **标准**: 随着ECMAScript标准的制定,...

    javaScript面向对象概论1

    JavaScript是一种基于原型(prototype-based)的面向对象编程语言,与基于静态类(class-based)的语言如Java、C++有很大区别。在JavaScript中,对象可以直接创建,无需预先声明类,而且对象的属性和方法可以在运行时...

    JavaScript面向对象之私有静态变量实例分析

    `test1`方法用于获取私有静态变量的当前值,`test2`方法允许改变私有静态变量的值,而`test3`方法则调用了私有静态方法。通过这种方式,虽然外部不能直接访问私有静态变量,但可以通过实例方法来读取或修改它。 ...

    JavaScript中的私有/静态属性介绍

    在提供的示例中,`staticPrivateValue`是静态私有变量,`MyObject`构造函数以及访问私有变量的方法都被封装在一个立即执行的函数表达式中,这样既能保持私有性,又能通过`MyObject.prototype`上的方法进行访问。...

    JavaScript 面向对象的 私有成员和公开成员

    在JavaScript中,虽然没有正式的private和public关键字来定义私有和公开成员,但是通过特定的编码约定和模式,我们可以模拟实现私有成员和公开成员的概念。 私有成员和公开成员是面向对象编程(OOP)中的基本概念。...

    JavaScript语言参考手册

    2. 数组:数组是有序的数据集合,可以使用索引访问元素,JavaScript提供了数组方法如push、pop、shift、unshift、splice、concat、slice等进行操作。 函数与闭包: 1. 函数:JavaScript函数是第一类对象,可以作为...

    面向对象javascript笔记

    8. **特权方法**:特权方法是介于公共和私有之间的方法,它们可以从对象外部调用,但可以访问到对象的私有变量。 9. **静态方法**:静态方法是属于类而不是类的实例的方法,通常用于工具函数或不需要实例化对象就...

    用户群:仅使用静态JavaScript,HTML和CSS创建安全的私有Web应用程序

    仅使用静态JavaScript,HTML和CSS创建安全的私有Web应用程序。什么是用户库? Userbase是向静态站点添加用户帐户和用户数据持久性的最简单方法。 可通过非常简单的直接从浏览器访问所有Userbase功能。 无需后端。...

    javascript-978-1-7871-2466-0:JavaScript:JavaScript开发人员的函数式编程

    在JavaScript中,Array.prototype上的map、filter和reduce等方法就是高阶函数的例子,它们用于处理数组。 3. **闭包**:闭包是函数能够访问并操作其词法作用域内变量的能力,即使该函数已经执行完毕。理解闭包对于...

    180个javascript代码模板,每个都很小,但是全面

    10. **闭包**:JavaScript的闭包是理解高级特性的重要概念,模板可能包含闭包的使用,如封装私有变量、模块化等。 11. **异步编程**:Promise和async/await是JavaScript处理异步操作的主要方式,模板可能包含这些...

    JS效果大全(以静态页面展示)

    JavaScript(简称JS)是一种广泛应用于Web开发的轻量级编程语言,主要负责网页的动态交互。在"JS效果大全(以静态页面展示)"这个压缩包中,我们可以期待找到一系列使用JavaScript实现的视觉效果,这些效果通常通过...

Global site tag (gtag.js) - Google Analytics