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使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如 ...
随机推荐
- lintcode :Valid Palindrome 有效回文串
题目: 有效回文串 给定一个字符串,判断其是否为一个回文串.只包含字母和数字,忽略大小写. 样例 "A man, a plan, a canal: Panama" 是一个回文. & ...
- Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
解决方案 : http://www.cnblogs.com/fly-100/p/4570366.html 这里我们直接在使用Input.GetMouseButtonDown(0)的地方加了一个检测函数 ...
- QSS的作用需要正确设置文件编码才能起作用
QT这个库,无非使用OO对跨平台做了绝佳的封装,这其中的主要工作也就是比较繁琐而已,但并不多么了不起.唯独其中提供的QSS功能,让我感到十分神奇,做出来的效果实在很惊艳,而使用代码却又是如此简单,而且 ...
- [iOS]开发者证书和描述文件的作用
先说下证书吧. 然后是描述文件
- epmap服务
epmap是 tcp 135和udp135端口135端口的“epmap - DCE endpoint resolution”记录可以通过连接到135端口和做适当的查询列举出来. 135端口大多数情况下 ...
- YASKAWA电机控制(1)---接线
实验室所购置电机型号为YASKAWA-AC SERVO MOTOR SGM7J-01AFC6S型,配SGD7S-R90A00A002伺服控制器.电机和控制器的操作说明书由安川中文官网安川电机资料提供. ...
- servlet request.getParamter 有时获取参数为null
他妈的,参数有时可以获取,有时又不行,折腾了好久,把tomcat换成8.0的,之前用apache-tomcat-7.0.67
- (七)CSS定位(Positioning)
CSS定位属性允许对元素进行定位. 一切皆为框: div.h1或p元素常被称为块级元素,而span和strong等元素成为行内元素,但是可是使用 display 属性改变框的类型,将display设置 ...
- (一)CSS三种插入方式
CSS概述 CSS(Cascading Style Sheets)指层叠样式表,样式定义了如何显示HTML元素. 样式通常存储在样式表中,样式与HTML分离解决了内容与表现分离的问题. 多个样式表可以 ...
- Java开发之单例设计模式
设计模式之单例模式: 一.单例模式实现特点:①单例类在整个应用程序中只能有一个实例(通过私有无参构造器实现):②单例类必须自己创建这个实例并且可供其他对象访问(通过静态公开的访问权限修饰的getIns ...