javascript 中的面向对象实现 如何封装

面向对象的手法来封装javascript ,javascript是没有类的概念的.

所以今天谈到的封装,其实就是用javascript的函数来实现的.


1

2

3

4


var People{

name:’一介布衣’,

age:’30‘

};

这就是javascript中的一个对象,里面封装了2个属性.

实例化一个对象的实例 people


1

2


var people=new People();

console.log(people.name,people.age);  //一介布衣,30

如果我们需要在函数里返回一个对象,如下代码:


1

2

3

4

5

6


function CreatePeople(){

return {

name:’一介布衣’,

age:’30‘

};

}

在代码中需要创建一个人的时候,我们需要调用 CreatePeople 即可,但是有一个问题,就是我们得到的都是同一个人 一介布衣,30岁.看来需要我们改造一个函数.


1

2

3

4

5

6


function CreatePeople(name,age){

return {

name:name,

age:age

}

}

这看上去貌似好多了.我们实例化2个对象.


1

2


var p1=new CreatePeople(‘张三’,19);

var p2=new CreatePeople(‘李四’,25);

我们知道javascript从object 到其他全局类都有一个prototype对象指向原型链.

但是,p1,p2 俩个对象貌似没有一点关系,虽然被同一个函数创建,但是CreatePeople 每次返回一个全新的对象,看似 p1,p2关系不大.

如果你接触过面向对象语言的编程,这时应该想到了构造函数,但是上面的 CreatePeople 函数怎么看都不是一个构造函数,我们也可以用javascript的函数来生成一个构造函数.


1

2

3

4


function CreatePeople(name,age){

this.name=name;

this.age=age;

}

this 和其他语言一样,也是一个指向实例的指针变量.

当用此构造函数创建对象的时候,this就指向新创建的对象,有一点需要记住,this取决调用函数作用域,而不是使用函数的作用域.

这样封装一下构造函数,生成的对象就比上面看上去顺眼多了.

2个属性指向了this实例指针,我们再来一个方法,去获取属性(也可以理解为私有变量)


1

2

3

4

5

6

7


function CreatePeople(name,age){

this.name=name;

this.age=age;

this.getName=function(){

return this.name;

}

}

getName 方法很简单,就是返回对象中的 name 属性值.

实例化2个对象


1

2


var p1=new CreatePeople(‘张三‘,20);

var p2=new CreatePeople(‘李四‘,21);


1

2


console.log(p1.getName()) //张三

console.log(p2.getName()) //李四

这时感觉封装的高大上的感觉,其实我们没有发现,CreatePeople 构造函数中的 getName 函数干的活很简单,但是每次都在实例上创建一个这样的函数确实有点浪费内存了,我们看下面的代码.


1


console.log(p1.getName==p2.getName);  //false

返回false ,告诉我们 p1,p2 中的 getName 不是指向内存中的一个地址,我们为了节省内存,如何让CreatePeople 构建出来的对象,多有 getName 方法指向一个指针地址? 对,Object 的原型链上.

我们把这个方法定义在构造函数的原型链上,这样构造的新对象都会继承原型链上的这个方法,(具体的javascript中的继承我们单独开一篇博文来讨论)


1

2

3

4

5

6

7

8

9

10

11

12

13

14


function CreatePeople(name,age){

this.name=name;

this.age=age;

}

CreatePeople.prototype.getName=function(){

return this.name;

}

var p1=new CreatePeople(‘张三‘,20);

var p2=new CreatePeople(‘李四‘,21);

console.log(p1.getName==p2.getName);  //true

可以看到p1 和 p2 对象都继承来自 CreatePeople 原型上的 getName 方法,而且所有对象的此方法指针都指向了一个地址.

这样,我们封装的目的就达到了.

时间: 2024-11-03 00:19:40

javascript 中的面向对象实现 如何封装的相关文章

JavaScript中OOP——>>>面向对象中的继承/闭包

  前  言  OOP  JavaScript中OOP-->>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.      >>> 继承的两方,发生在两个类之间. 1.2JS模拟实现继承的三种方式:        首先,了解一下call/apply/binb:通过函数名调用方法,强行将函数中的this指向某个对象:            call写法:  func.call(func的this指向的obj,参数

如何理解并学习javascript中的面向对象(OOP) [转]

如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript面向对象,否则你无法更灵活的使用javascript这门语言. 什么事闭包?到底什么是原型?(知道闭包和原型的,就算得上是javascript的高手了.但真正能够理解,并且灵活运用的人并不多)到底该如何学习javascript中的面向对象呢?在javascript这么语言正如日中天,相信不少人正在为

前端开发:面向对象与javascript中的面向对象实现(一)

前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“找不到对象!”,他:“就你那样也能找得到对象?”.我一脸黑线...... 废话不多说,今天博主要跟大家聊的是<面向对象与javascript中的面向对象实现>”. 面向对象理解: 面向对象是一种对现实世界理解和抽象的方法,是一种先进的程序设计理念,是一种比较抽象的,多形态的设计模式.我们可以这么理

前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的影响,单单是自己的念想受到了一定得局限,想法不能够像平地而起的高楼大厦建成一样.可是那大楼也是有烂尾的呀,我觉得最重要的还是外在环境与个人观念的先决条件,决定了拖延症的症状的好坏,有那么一些人,它也有拖延症,但是它在拖的中间,想的更多,看的更远.事情在做的时候更加有条不紊,这拖延症这样看来,它也是好

javascript中的面向对象(object-oriented)编程

本文原发于我的个人博客,经多次修改放到csdn上,主要是做备份用,为了更好的阅读体验,请到我的个人博客上阅读. 最近工作一直在用nodejs做开发,有了nodejs,前端.后端.脚本全都可以用javascript搞定,很是方便.但是javascript的很多语法,比如对象,就和我们常用的面向对象的编程语言不同:看某个javascript开源项目,也经常会看到使用this关键字,而这个this关键字在javascript中因上下文不同而意义不同:还有让人奇怪的原型链.这些零零碎碎的东西加起来就很容

javascript 中的面向对象中比较好的资料

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_

javaScript中的面向对象表示

我们知道,面向对象的语言都有一个特点,那就是一般都有类的概念,进而有类的属性和方法等概念. 然而javaScript中并没有类的概念,那我们怎么去通过这个语言本身去实现一些面向对象的特性呢? (1)一个最简单的方式 创建Object的实例,为它添加属性和方法 var car = new Object(); //创建实例 car.color = "red"; //为car这个对象增加颜色的属性 car.showColor= function(){ //car的方法 alert(this.

深入JavaScript(一)——JavaScript中的面向对象(一)

面向对象的语言有一个标志,那就是它们都有"类"的概念,通过类可以创建任意多个具有相同属性和方法的对象.JavaScript 中没有类的概念,因此它的面向对象与基于类的语言中的对象有所不同. JavaScript 对对象的定义是:无序属性的集合,其属性可以包含基本值.对象或者函数.可以把 JavaScript 对象理解成散列表,即一组名值对,其中的值可以是数据或函数. 那么想要创建自定义对象,有以下几种常用方法: 1.使用 Object 构造函数: var person = new Ob

深入理解javascript中实现面向对象编程方法

介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是复制栈上的信息,这样就会出现以下情况,如果变量是对象,那么这一操作,复制的只是真正对象所在 的堆内存空间的起始地址,这就是所谓的浅拷贝,如果是深拷贝,则是在内存堆空间中重新分配一个内存,并把分配的内存的起始地址复制过去. 2. 引用类型数据和值类型数据:谈到引用类型数据和值类型数据,自然而然的联想到