面象对象编程技术的核心理念:封装、继承、多态;在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接和容易了,因为javascript并不是面向对象的语言,所以我们只能通过javascript的一些特性,比如:闭包、原型链等来模拟出面向对象编程,我认为这些是作为熟练掌握与灵活运用javascript的基础,园子里已有很多的javascript高手对于这方面都有介绍与分析,而我仅以作为一个项目负责人(独立设计与开发WEB前端与后端)的视角来重新理解javascript面向对象要点。

既然是面向对象,首先我们要知道如何创建一个对象,以下列出了创建对象的几种常见方法:

A.直接创建一个对象实例:

//直接实例化一个对象
var Person1 = { Name: "梦在旅途", Age: 29, Sex: "男", Height: 178 }; alert(Person1.Name); var Person2 = new Object();
Person2.Name = "梦在旅途";
Person2.Age = 29;
Person2.Sex = "男";
Person2.Height = 178; alert(Person2.Name); //这个是上面的简写
var Person3 = new Object({ Name: "梦在旅途", Age: 29, Sex: "男", Height: 178 });
alert(Person3.Name);

优点:直接创建一个对象,无需提前定义类型;

缺点:无法实现复用;

B.先定义后实例化对象:

//先定义类,再实例化成对象
function Person4(n,a,s,h) {
this.Name = n;
this.Age = a;
this.Sex = s;
this.Height = h;
} var p4 = new Person4("梦在旅途", 29, "男", 178);
alert(p4.Age);

优点:类似面向对象编程语言的构造函数,容易理解,且定义后可通过new关键字实例化多个对象,实现复用。

缺点:需先定义后才能实例化;

综上所述,建议采用B方法来创建对象。

实现封装,即只暴露公共方法与公共属性,隐藏实现细节(私有方法、属性)

function Person5(n, a, s, h) {

    //公共属性
this.Name = n;
this.Age = a;
this.Sex = s;
this.Height = h; //公共方法
this.AfterYear = function (count) {
updateAge(count);
alert(_currentYear +"后,我已经:" + this.Age +"岁了!");
}; this.Say = function () {
alert("我的个人信息--> Name: "+ this.Name+", Age: "+ this.Age +", Sex: "+ this.Sex +", Height:" + this.Height);
} //私有属性与方法
var _self = this;
var _currentYear = 2015;
function updateAge(count) {
_currentYear += count;
_self.Age += count;
};
} var p5 = new Person5("梦在旅途", 29, "男", 178);
p5.AfterYear(10);
p5.AfterYear(25);

利用原型链实现继承,即一个对象包含另一个对象的所有公共属性与方法,实现继承的方法有很多,我觉得采用如下形式来模拟继承更符合面向对象的思维:

function SoftEngineer(n, a, s, h, lang) {
Person5.call(this, n, a, s, h);//将Person5的所有属性与方法包含到SoftEngineer中,从而实现继承
this.Lang = lang;
this.SayCode = function () {
alert("我是一名软件工程师,我会" + this.Lang + "编程语言!");
} this.Working = function () { };//空方法,类似面向对象中的虚方法
} SoftEngineer.prototype = new Person5(); //将SoftEngineer的原型指定Person5的实例 var softengr = new SoftEngineer("梦在旅途", 29, "男", 178, "javascript");
softengr.Say();
softengr.SayCode();

利用原型链实现多态,即基于同一个方法签名在不同的子类中表现的形式不同:

function WebSoftEngineer(n, a, s, h, lang) {
SoftEngineer.apply(this, [n, a, s, h, lang]);
this.Working = function () {
alert("我是网页工程师,从事网页开发设计工作!");
};
}; WebSoftEngineer.prototype = new SoftEngineer(); function AppSoftEngineer(n, a, s, h, lang) {
SoftEngineer.apply(this, [n, a, s, h, lang]);
this.Working = function () {
alert("我是应用工程师,从事客户端应用程序开发设计工作!");
};
};
AppSoftEngineer.prototype = new SoftEngineer(); var webengr = new WebSoftEngineer("梦在旅途", 29, "男", 178, "javascript");
webengr.Say();
webengr.Working(); var appengr = new AppSoftEngineer("梦在旅途", 29, "男", 178, "c#");
appengr.Say();
appengr.Working();

  

javascript必知必会:面象对象编程的更多相关文章

  1. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  2. 【EatBook】-NO.1.EatBook.1.JavaData.1.001-《JSON 必知必会-Introduction to JavaScript Object Notation》-

    1.0.0 Summary Tittle:[EatBook]-NO.1.EatBook.1.JavaData.1.001-<JSON 必知必会-Introduction to JavaScrip ...

  3. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  4. H5系列之History(必知必会)

    H5系列之History(必知必会)   目录 概念 兼容性 属性 方法 H5方法       概念     理解History Api的使用方式 目的是为了解决哪些问题   作用:ajax获取数据时 ...

  5. H5系列之地理位置(必知必会)

    H5之地理位置必知必会     [02]概念   规范地址:http://www.w3.org/TR/geolocation-API/     HTML5 Geolocation(地理定位)用于定位用 ...

  6. 第4节:Java基础 - 必知必会(中)

    第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...

  7. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  8. Java面试必知必会(扩展)——Java基础

    float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...

  9. 闻道Go语言,6月龄必知必会

    大家好,我是马甲哥, 学习新知识, 我的策略是模仿-->归纳--->举一反三, 在同程倒腾Go语言一年有余,本次记录<闻道Go语言,6月龄必知必会>,形式是同我的主力语言C#做 ...

随机推荐

  1. C++11新特性总结 (二)

    1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...

  2. 必应词典UWP版-开发小结

    摘要 必应词典UWP版已经上线2周了!相信有不少用户都已经体验过了吧!得益于Win10全新.强大的API,新版词典在性能上.UI体验上都有了大幅的提升,今天,小编就为大家讲讲必应词典UWP开发的故事. ...

  3. 【读书笔记】WebApi 和 SPA(单页应用)--knockout的使用

    Web API从MVC4开始出现,可以服务于Asp.Net下的任何web应用,本文将介绍Web api在单页应用中的使用.什么是单页应用?Single-Page Application最常用的定义:一 ...

  4. HttpContext.Current:异步模式下的疑似陷阱之源

    最近园子里首页有好几篇文章都是讲异步编程的,尤其是几篇讲博客园自身的异步化建设的文章,看了以后很有收获. 闲暇之余再重新查查资料温故知新学习一遍,重新认识了SynchronizationContext ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK

    Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...

  6. Vue.js线程机制问题还是数据双向绑定有延迟的问题

    最近用select2做一个下拉多选,若只是从后端获取一个列表渲染还好说,没有任何问题.但要用select2对数据初始化时进行selected的默认选项进行显示,就出现问题了. vm.$set('are ...

  7. 关于js内部运行机制的一本好书

    读<单页Web应用一书>,第二章讲了js内部运行机制,感觉棒极了.之前读<你不知道的js>,看的云里雾里,似懂非懂.没想到单页Web一书将此内容讲的如此通俗易懂,好多困惑已久的 ...

  8. 记录自己在使用Bootstrap中的心得

    一.网格系统 在做CRM OP后台时,直接在前人的的一些页面上进行了修改和增加,发现一些东西增加字段后有问题,比如网格系统,怎么改样式都不对,最后自己没法发,做成了半响应式的了.今天重新看Bootst ...

  9. weinre使用

    2016-1-21 更新说明: 微信web开发者工具已经集成了weinre,只需设置手机代理便可调试任意页面,更简单更方便,推荐使用! Web应用开发者需要针对手机进行界面的调试,但是手机上并没有称心 ...

  10. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串

    Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso  向ByteArrayOutputStream这个流理想write字节..然后可以使 ...