javascript 面向对象整理
整理一下js面向对象中的封装和继承。
1.封装
js中封装有很多种实现方式,这里列出常用的几种。
1.1 原始模式生成对象
直接将我们的成员写入对象中,用函数返回。 缺点:很难看出是一个模式出来的实例。
代码:
- function Stu(name, score) {
- return {
- name: name,
- score: score
- }
- }
- var stu1 = Stu("张三", 80);
- var stu2 = Stu("李四", 90);
- console.log(stu1.name); // 张三
1.2 生成构造模式对象
js帮我们提供了一个使用构造函数生成对象的模式,¨所谓“构造函数”,其实就是一个普通函数,但是内部使用了this变量。当使用new关键字对构造函数生成实例后,this变量则会绑定在实例对象上。
直接上代码:
- function Stu(name, score) {
- this.name = name,
- this.score = score
- }
- var stu1 = new Stu("张三", 80);
- var stu2 = new Stu("李四", 90);
- console.log(stu1.name + "/" + stu2.score); // 张三 90
- console.log((stu1.constructor == Stu) + "/" + (stu2.constructor == Stu)); // true true
- console.log((stu1 instanceof Stu) + "/" + (stu2 instanceof Stu)); // true true
不难看出js的构造函数生成对象和C#用class生成对象如出一辙,都是用模板定义对象成员通过new关键字实例化。
用C#代码生成同样的Stu对象
- Class Stu
- {
- public string name;
- public double score;
- }
1.3 Prototype模式
在js中,每一个构造函数都有一个prototype属性,这个对象的所有属性和方法,都会被构造函数的实例继承。
所以实例出来的对象会包含prototype中声明的成员,每个实例出来的对象都是独立的,他们并不会相互影响。
代码:
- function Stu(name, score) {
- this.name = name,
- this.score = score
- }
- Stu.prototype.type='学生';
- Stu.prototype.log = function (s) {
- console.log(s);
- }
- var stu1 = new Stu("张三", 80);
- var stu2 = new Stu("李四", 90);
- console.log(stu1.type + "/" + stu2.type); // 学生 学生
- stu1.log('hello'); // hello
- console.log(stu1.log == stu2.log); // true
封装就讲到这儿了,下面我们来看看js中继承又是如何实现的?
2.继承
2.1 构造函数绑定
- function Stu(name, score) {
- Grade.apply(this, arguments);
- //Grade.call(this, arguments);
- this.name = name,
- this.score = score
- }
- function Grade() {
- this.code = "初中";
- this.ask = function () {
- console.log("大家好");
- }
- }
- var stu1 = new Stu("张三", 80);
- var stu2 = new Stu("李四", 90);
- console.log(stu1.code); // 初中
- stu1.ask(); // 大家好
这里的apply做了两件事情,把第一个参数this给Grade构造函数(调用者),然后再执行Grade里的代码。就相当于将Grade中用this定义的成员在Stu中再执行一遍。
所以利用call或apply继承有一个缺点:无法继承prototype中声明的对象。
我们可以利用prototype继承来解决这个问题。
2.2 通过prototype继承
先看代码
代码:
- function Stu(name, score) {
- this.name = name,
- this.score = score
- }
- function Grade() {
- this.code = "初中";
- }
- Stu.prototype = new Grade();
- Stu.prototype.constructor = Stu; //防止继承链的紊乱,手动重置声明
- var stu1 = new Stu("张三", 80);
- var stu2 = new Stu("李四", 90);
- console.log(Stu.prototype.constructor); // 自己的构造函数
- console.log(stu1.code); // 初中
2.3 拷贝继承
把父对象的所有属性和方法,拷贝进子对象,实现继承。
代码:
- function Stu(name, score) {
- this.name = name,
- this.score = score
- }
- function Grade() {}
- Grade.prototype.code = "初中";
- }
- //函数封装
- function extend(C, P) {
- var p = P.prototype;
- var c = C.prototype;
- for (var i in p) {
- c[i] = p[i];
- }
- }
- extend(Stu, Grade);
- var stu1 = new Stu("张三", 80);
- var stu2 = new Stu("李四", 90);
- stu1.code='高中';
- console.log(stu1.code); // 高中
- console.log(stu2.code); // 初中
- console.log(Stu.prototype.constructor);
- console.log(Grade.prototype.constructor)
js面向对象的整理就写到这了,这个东西也不是一成不变的,使用的时候根据自己的需求做改动。 有句话说的很好,合适的才是最好的。
javascript 面向对象整理的更多相关文章
- javascript面向对象精要第三章对象整理精要
什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...
- JavaScript 精髓整理篇之一(对象篇)postby:http://zhutty.cnblogs.com
废话篇头: 由于工作关系,所以写博文的时间有那么点~~,其实是输入法太懒了,都是输入法的错~~ 这一系列的博客将总结所有关于JavaScript语言的精髓,适合0基础到大师级别人物阅读. <Ja ...
- 闭包初体验 -《JavaScript面向对象编程指南》
下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 参考<JavaScript面向对象编程指南> 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函 ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- javascript面向对象系列第四篇——选项卡的实现
前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- javascript面向对象系列第一篇——构造函数和原型对象
× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如 ...
随机推荐
- C# 虚方法的重载 new 与 virtual
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- IIS常见错误及解决
IIS常见错误 1.HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决办法: w ...
- 解决在windows的eclipse上面运行WordCount程序出现的一系列问题详解
一.简介 要在Windows下的 Eclipse上调试Hadoop2代码,所以我们在windows下的Eclipse配置hadoop-eclipse-plugin- 2.6.0.jar插件,并在运行H ...
- 220 DIV2 B. Inna and Nine
220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...
- 【Linux高频命令专题(21)】df
概述 linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 显示指定磁盘文件的可用空间.如果没有文件名 ...
- 一起学Maven
转载自:http://blog.csdn.net/songdeitao/article/details/18452459 一. 初识Maven 开场白 在现在的项目开发过程中,越来越重视项目的管理,而 ...
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- 网站TCP链接暴增
昨天上线后,TCP链接暴增,红点增多. 问题在查.其中有一部分,多线程修改,突破了线程数 64的限制.线程内,会发起网络请求. 怀疑是热点之一.其他的部分也有修改,也被怀疑.准备下次,2部分分开上线. ...
- apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]
ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...
- 爬虫技术(五)-- 模拟简单浏览器(附c#代码)
由于最近在做毕业设计,需要用到一些简单的浏览器功能,于是学习了一下,顺便写篇博客~~大牛请勿喷,菜鸟练练手~ 实现界面如下:(简单朴素版@_@||) button_go实现如下: private vo ...