js公有、私有、静态属性和方法的区别

现下,javascript大行其道,对于网站开发人员来说,javascript是必需掌据的一门语言,但随着jquery等框架的流行和使用,许多人 对于原生javascript缺乏深入的理解,习惯了函数式的编辑风格,对于闭包、原型总是说不清道不明.对于js面向对象蹩脚的用着,而要了解js面向 对象,就必需先了解js中什么是公有方法、特权方法、静态方法

公有属性和公有方法

function User(name,age){

    this.name = name;//公有属性

    this.age = age;

}

User.prototype.getName = function(){//公有方法

   return this.name;

}

var user = new User(‘fire子海‘,26);

console.log(user.getName());//output:fire子海
私有属性和方法

function User(name,age){

    var name = name;//私有属性

    var age = age;

   function alertAge(){//私有方法

         alert(age);

   }

   alertAge(age); //弹出26

}

var user = new User(‘fire子海‘,26);
静态属性和方法

在php中,无需实例化就可以调用的方法就叫静态方法,js也一样,无需实例化,即用new操作符实化对象,就可调用对象的方法和属性。

function User(){}

User.age = 26;//静态属性

User.myname = ‘fire子海‘;

User.getName =function(){//静态方法

    return this.myname;//如果这里使用this.name,返回的将是User,所有改用了myname,

}

console.log(User.getName());//output:fire子海
特权方法

function User(name,age){

    var name = name;//私有属性

    var age = age;

    this.getName = function(){ //特权方法

          return name;//私有属性和方法不能使用this调用

   }

}

var user = new User(‘fire子海‘,26);

console.log(user.getName());//output:fire子海
静态类

对于静态方法和静态属性,我们无需像第三步中那样去创建,如果网友看过我那篇“js如何制作图片轮播”,就知道可以使用字面量的方式来创建。

var user = {

   init:function(name,age){

      this.name = name;

      this.age = age;

   },

   getName:function(){

      return this.name;

  }

}

user.init(‘fire子海‘,26);

console.log(user.getName());//output:fire子海
公有方法的调用规则

调用公有方法,我们必需先实例化对象

公有方法中通过不this调用公有属性和特权方法,不能使用this调用静态方法和属性,必需裁通过对象本身调用,即对象名。公有方法也不能调用私有方法

function User(){

    this.myname = ‘fire子海‘;//公有属性

    this.age = 26;

    this.do = function(){//特权方法

        return this.myname+‘学习js‘;

    }

}

User.eat = function(food){

  return ‘晚餐只有‘+food;

}

User.prototype.alertAge = function(){

   alert(this.age);

}

User.prototype.alertDo = function(){

   alert(this.do());//调用特权方法

}

User.prototype.alertEat = function(food){

   alert(User.eat(food));//只能通过对象本身调用静态方法

   //alert(this.ear(food))这样调用将出错:this.eat is not a function

}

var user = new User();

user.alertAge();//alert:26

user.alertDo();//alert:fire子海学习js

user.alertEat(‘方便面‘)//alert:晚餐只有方便面
静态方法的调用规则

使用静态方法时,无需实例化对象,便可以调用,对象实例不能调用对象的静态方法,只能调用实例自身的静态属性和方法

function User(){}

User.age = 26;//静态属性

User.myname = ‘fire子海‘;

User.getName =function(){//静态方法

    return this.myname;

}

var user = new User();

console.log(user.getName);//TypeError: user.getName is not a function

user.supper = ‘方便面‘;

user.eat = function(){

  return ‘晚餐只有‘+this.supper;

}

user.eat();//晚餐只有方便面

静态方法无法调用公有属性、公有方法、私有方法、私有属性、特权方法和原型属性

function User(){

       this.myname = ‘fire子海‘;//公有属性

       this.age = 26;

       this.do = function(){//特权方法

            return this.myname+‘学习js‘;

        }

}

User.prototype.alertAge = function(){//公共方法,也叫原型方法

    alert(this.age);

}

User.prototype.sex = ‘男‘;//原型属性

User.getName= function(){//静态方法

    return this.myname;

}

User.getAge = function(){

     this.alertAge();

}

User.getDo = function(){

    return this.do();

}

//console.log(User.getName())//undefined

//console.log(User.getDo());//TypeError: this.do is not a function

//console.log(User.getAge())//TypeError: this.alertAge is not a function
特权方法的调用规则

特权方法通过this调用公有方法、公有属性,通过对象本身调用静态方法和属性,在方法体内直接调用私有属性和私有方法

function User(girlfriend){

     var girlfriend = girlfriend;

     function  getGirlFriend(){ 

         return ‘我女朋友‘+girlfriend+‘是美女!‘;

     }

    this.myname = ‘fire子海‘;//公有属性

    this.age = 26;

    this.do = function(){//特权方法

        return this.myname+‘学习js‘;

    }

   this.alertAge = function(){

      this.changeAge();//特权方法调用公有方法

       alert(this.age);

   }

   this.alertGirlFriend = function(){

      alert(getGirlFriend());//调用私有方法

   }

}

User.prototype.changeAge = function(){

    this.age = 29;

}

var user = new User(‘某某‘);

user.alertAge();//alert:29

user.alertGirlFriend();//alert:我的女朋友某某是美女!
私有方法

对象的私有方法和属性,外部是不可以访问的,在方法的内部不是能this调用对象的公有方法、公有属性、特权方法的

function User(girlfriend){

     var girlfriend = girlfriend;

    this.myname = ‘fire子海‘;//公有属性

    this.age = 26;

    function  getGirlFriend(){ 

     //this.myname ;//此时的this指向的window对象,并非User对象,

       // this.myname = ‘fire子海‘,此时的this指向的是getGirFriend对象了。

   //如果通过this调用了getGirFriend中不存在的方法呀属性,this便会指向window 对象,只有this调用了getGirlFriend存在的方法和属性,this才会指定getGirlFriend;

         alert(User.eat(‘泡面‘));//alert:晚餐只有方便面

    }

    this.do = function(){//特权方法

        return this.myname+‘学习js‘;

    }

   this.alertAge = function(){

      this.changeAge();//特权方法调用公有方法

       alert(this.age);

   }

   this.alertGirlFriend = function(){

      getGirlFriend();//调用私有方法

   }

}

User.eat = function(supper){

  return ‘晚餐只有‘+supper;

}

var user = new User(‘某某‘);

user.alertGirlFriend();

引用:http://jingyan.baidu.com/article/d5c4b52bc2f71dda570dc575.html

时间: 2024-10-17 22:27:52

js公有、私有、静态属性和方法的区别的相关文章

JS截取字符串substr 和 substring方法的区别

substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数 stringvar 必选项.要提取子字符串的字符串文字或 String 对象. start 必选项.所需的子字符串的起始位置.字符串中的第一个字符的索引为 0. length 可选项.在返回的子字符串中应包括的字符个数. 说明 如果 length 为 0 或负数,将返回一个空字符串.如果没有指定该参数,则子字符串将延续到 stringvar 的最后. 示

vue中计算属性vs方法的区别

一 什么是计算属性? 计算属性(computed),也是一个属性,也是用来存储数据用的,但是和data属性相比还是有区别 1 数据是可以进行逻辑处理相关的操作 2 可以对计算属性中的数据进行监视 例如: 调用的方式都是一样的 二 计算属性和方法的区别? 1 计算属性是基于它所依赖的数据进行更新,在有在相关依赖的数据发生变化了才会进行更新,而普通的方法每次都会执行 2 计算属性是有缓存的,只要它所依赖的数据没有发生改变,后面的每一次访问计算属性中的值,都是之前缓存的结果,不会重复执行. 例如: h

js公有、私有、静态属性和方法

/* 静态方法/属性:无需实例化就可以使用,不能通过this调用,只能通过对象本身,即对象名User,实例无法调用 公有方法/属性:需要实例化才能用,静态方法无法调用 */ function User(){ this.name="happy";//公有属性 this.getname=function(){//公有方法 return this.name; } var age;//私有属性 function setAge(){//私有方法 age=1; } this.getAge=func

JS 实现继承静态属性

在应用中,我们常常设计继承关系,当然静态属性也是很简单的,但是如果把这两者结合到一起,还是需要一些技巧的. 场景描述: 父类:定义静态属性类型,仅仅起到描述的作用,具体的实例化交给每一个子类去做. 定义抽象方法,并且在方法中会调用之前定义的静态属性. 子类:继承父类.子类对静态属性进行赋值. 子类的对象,调用父类的接口. 实现继承代码如下(不是重点): function inherit(sub, sup) {     function F() {}     F.prototype = sup.p

js类的静态属性应该如何抽象?

基类 var BaseUnit = function(config) {         var me = this;         me.init();     }; 子类1: var ByteUnit = function(config) {         var me = this;         BaseUnit.apply(me, arguments);     };     ByteUnit.prototype = {         constructor: ByteUnit

static 关键字 静态属性与方法 -> :: self $this 区别

1.声明类属性或方法为静态,就可以不实例化类而直接访问.静态属性不能通过一个类已实例化的对象来访问(但静态方法可以). 2.由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用. 3.静态属性不可以由对象通过 -> 操作符来访问. 4.用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误. 5.就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式.所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值

Node.js process 模块常用属性和方法

Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.maiziedu.com/course/694/有所帮助. 如果不是和命令行工具打交道,可能我们很少有机会去用到process模块中的一些方法或者属性.不过如果你要做类似于webpack或者gulp等较为复杂的构建工具,由于bash界面就是和用户直接交流的工具,因此友好的输入输出,完整的提示都非常有必

JS中如何实现属性和方法的继承

JS中面向对象的实现: function Person(name,color){ this.name = name; this.color = color; } Person.prototype.showName = function(){ alert(this.name); } Person.prototype.showColor = function(){ alert(this.color); } function Worker(name,color,job,age){ Person.app

js操作dom元素属性和方法

1.用于处理xml文档的dom元素属性 属性名                      描述 childNodes返回当前元素所有子元素的数组 firstChild返回当前元素的第一个下级子元素 lastChild返回当前元素的最后一个子元素 nextSbling返回紧跟在当前元素后面的元素 nodeValue指定表示元素值的读写属性 parentNode返回元素的父节点 previousSibling返回紧邻当前元素之前的的元素 2.用于遍历XML文档的dom元素方法 方法名