js面向对象之公有、私有、静态属性和方法详解
现下,javascript大行其道,对于网站开发人员来说,javascript是必需掌据的一门语言,但随着jquery等框架的流行和使用,许多人对于原生javascript缺乏深入的理解,习惯了函数式的编辑风格,对于闭包、原型总是说不清道不明.对于js面向对象蹩脚的用着,而要了解js面向对象,就必需先了解js中什么是公有方法、特权方法、静态方法
方法/步骤
1.公有属性和公有方法
|
1
2
3
4
5
6
7
8
9
|
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子海 |
2.私有属性和方法
|
1
2
3
4
5
6
7
8
9
|
function User(name,age){ var name = name;//私有属性 var age = age; function alertAge(){//私有方法 alert(age); } alertAge(age); //弹出26}var user = new User('fire子海',26); |
3.静态属性和方法
在php中,无需实例化就可以调用的方法就叫静态方法,js也一样,无需实例化,即用new操作符实化对象,就可调用对象的方法和属性。
|
1
2
3
4
5
6
7
8
|
function User(){}User.age = 26;//静态属性User.myname = 'fire子海';User.getName =function(){//静态方法 return this.myname;//如果这里使用this.name,返回的将是User,所有改用了myname,}console.log(User.getName());//output:fire子海 |
4.特权方法
|
1
2
3
4
5
6
7
8
9
|
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子海 |
5.静态类
对于静态方法和静态属性,我们无需像第三步中那样去创建,如果网友看过我那篇“js如何制作图片轮播”,就知道可以使用字面量的方式来创建。
|
1
2
3
4
5
6
7
8
9
10
11
|
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子海 |
6.公有方法的调用规则
调用公有方法,我们必需先实例化对象
公有方法中通过不this调用公有属性和特权方法,不能使用this调用静态方法和属性,必需裁通过对象本身调用,即对象名。公有方法也不能调用私有方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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:26user.alertDo();//alert:fire子海学习jsuser.alertEat('方便面')//alert:晚餐只有方便面 |
7.静态方法的调用规则
使用静态方法时,无需实例化对象,便可以调用,对象实例不能调用对象的静态方法,只能调用实例自身的静态属性和方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 functionuser.supper = '方便面';user.eat = function(){ return '晚餐只有'+this.supper;}user.eat();//晚餐只有方便面 |
静态方法无法调用公有属性、公有方法、私有方法、私有属性、特权方法和原型属性
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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 |
8.特权方法的调用规则
特权方法通过this调用公有方法、公有属性,通过对象本身调用静态方法和属性,在方法体内直接调用私有属性和私有方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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:29user.alertGirlFriend();//alert:我的女朋友某某是美女! |
9.私有方法
对象的私有方法和属性,外部是不可以访问的,在方法的内部不是能this调用对象的公有方法、公有属性、特权方法的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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();总结:给对象动态添加的属性或方法是静态属性或静态方法;
var obj={};
obj.name="张三";//静态属性
obj.run=function(){
console.log(obj.name);//静态的方法
}
obj.run();//进行调用
|
js面向对象之公有、私有、静态属性和方法详解的更多相关文章
- JavaScript 公有 私有 静态属性和方法
1.公有属性和公有方法 这里的 name age 都是参数传递进去 可以在外面直接实例化调用. 2.私有属性和方法 私有的只能在函数内部使用 作用域的原因 3.静态属性和静态方法 这里我首先 创建 ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- JS面向对象编程,对象,属性,方法。
document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- python学习笔记8--面向对象--属性和方法详解
属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- ListView的属性及方法详解
本文转载于:http://blog.csdn.net/vector_yi/article/details/23195411 近期在重新学习Android控件知识,目前进行到ListView,感觉这是一 ...
- VB6.0中WinSock控件属性和方法详解
原文链接:http://liweibird.blog.51cto.com/631764/653134 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器 ...
- iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)
很多APP都会涉及到搜索框,苹果也为我们提供了默认的搜索框UISearchBar.但实际项目中我们通常需要更改系统默认搜索框的样式.为了实现这一目标,我们需要先搞懂 UISearchBar 的属性及方 ...
随机推荐
- [总结] O(n)求和为0的最长子段
以这题为例 Solution 我们首先用前缀和差分,可以认为G是1,R是-1,然后求一个前缀和qzh. 如果 qzh[i]==qzh[j] 那么 i~j 这一整段,一定是一个和为0的区间,即红绿相等的 ...
- cloneNode和replaceChild
node.cloneNode(deep) var node=document.getElementById("myList2").lastChild.cloneNode(true) ...
- 【Python】 virtualenv虚拟环境建设和管理
[virtualenv] 用Python开发时面临的一个大问题就是每个项目需要的依赖包不一致.如果是包本身不一样倒还好,如果不同项目需要的是不同版本的包的话就会很麻烦.如果采用统一的系统Python环 ...
- Redis --> 为redis分配新的端口
为redis分配新的端口 为redis分配一个8888端口,操作步骤如下:1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf.2.打开redis8888 ...
- salesforce lightning零基础学习(一) lightning简单介绍以及org开启lightning
lightning对于开发salesforce人员来说并不陌生,即使没有做过lightning开发,这个名字肯定也是耳熟能详.原来的博客基本都是基于classic基于配置以及开发,后期博客会以ligh ...
- Sum of xor
Sum of xor jdoj-2160 题目大意:给你一个n,求1^2^...^n. 注释:$n<=10^{18}$. 想法:第一道异或的题.先来介绍一下什么是异或.a^b表示分别将两个数变成 ...
- dom4j 最常用最简单的用法(转)
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http://nchc.dl.sourceforg ...
- maven库
1.本地仓库 本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用. 当你向仓库请求插件或依赖的时候,会先检查本地仓库里是否有.如果有则直接返回,否则会向远程仓库请求,并做缓存. 本地仓库默认在 ...
- linux小白成长之路8————访问Docker中的mysql
[内容指引] 本篇实战演示如何操作Docker中的mysql数据库,包含以下五个知识点: 登录容器: 登录mysql: 运行SQL指令创建数据库: 退出mysql: 退出容器: 1.登录容器 我们在上 ...
- ECEF和大地坐标系的相互转化
在阅读 RTKLIB的源码时,发现了ECEF和大地坐标系的相互转换的函数,大地坐标系(φ,λ,h)转成ECEF(X,Y,Z)与所看书籍(GPS原理与接收机,谢刚,电子工业出版社)的公式是一样的,而EC ...