JS面向对象(封装,继承)
在六月份找工作中,被问的最多的问题就是: js面向对象,继承,封装,原型链这些,你了解多少?
额,,,我怎么回答呢, 只能说,了解一些,不多不少,哈哈哈哈,当然,这是玩笑话。
不过之前学过java,来理解这些还是很容易的。
所以趁着自己空闲的时间,理一理,,这些,,
一、封装
1.原始方法
// 通过new关键字生成一个对象,然后根据javascript是动态语言的特性来添加属性和方法,构造一个对象。其中this表示调用该方法的对象。
var obj = new Object();
obj.name = 'jessie';
obj.age = 22;
obj.showName = function(){
alert(this.name);
};
obj.showAge = function(){
alert(this.age);
}
obj.showName(); //jessie
obj.showAge(); //
// 这种方式的问题是如果需要多次创建对象,那么需要重复代码多次,不利于代码的复用。
2.工厂模式
function createBlog(name, url) {
var obj = new Object();
obj.name = name;
obj.url = url;
obj.sayName = function(){
alert(this.name);
};
obj.sayUrl = function() {
alert(this.url);
};
return obj;
}
var blog1 = createBlog('jessie', 'http://www.cnblogs.com/xiayu25/');
var blog2 = createBlog('cuit', 'http://www.cuit.edu.cn');
blog1.sayName(); // jessie
blog1.sayUrl(); // http://www.cnblogs.com/xiayu25/
blog2.sayName(); // cuit
blog2.sayUrl(); // http://www.cuit.edu.cn
// 通过定义几个函数的对象,解决了不同对象持有函数对象的私有属性问题。
// 现在所有对象的方法都持有上面两个函数的引用,
// 但这么一来,对象的函数又和对象相互独立了,这和面向对象中持有方法属于与特定类的思想不符。
// 可以看到工厂模式的实现方法非常简单,解决了创建多个相似对象的问题,
// 但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。
3.构造函数模式
function Blog(name, url){
//var this=new Object(); //系统模拟创建对象
this.name = name;
this.url = url;
this.sayName = function(){
alert(this.name);
};
this.sayUrl = function(){
alert(this.url);
};
}
var blog1 = Blog('jessie', 'http://www.cnblogs.com/xiayu25/');
var blog2 = Blog('cuit', 'http://www.cuit.edu.cn');
blog1.sayName(); // jessie
blog1.sayUrl(); // http://www.cnblogs.com/xiayu25/
blog2.sayName(); // cuit
blog2.sayUrl(); // http://www.cuit.edu.cn
// 这个例子与工厂模式中除了函数名不同以外,细心的童鞋应该发现许多不同之处:
// 函数名首写字母为大写(虽然标准没有严格规定首写字母为大写,但按照惯例,构造函数的首写字母用大写)
// 没有显示的创建对象
// 直接将属性和方法赋值给了this对象
// 没有return语句
// 使用new创建对象
// 能够识别对象(这正是构造函数模式胜于工厂模式的地方)
// 构造函数虽然好用,但也并非没有缺点
// 构造函数的方式与工厂加工方式一样,会为每个对象创建独享的函数对象,
// 当然也可以将这些函数对象定义在构造函数外面,这样又有了对象和方法相互独立的问题
4.原型模式
function Blog() {}
Blog.prototype.name = 'jessie';
Blog.prototype.url = 'http://www.cnblogs.com/xiayu25/';
Blog.prototype.friend = ['fr1', 'fr2', 'fr3', 'fr4'];
Blog.prototype.alertInfo = function() {
alert(this.name + this.url + this.friend );
};
var blog1 = new Blog(), blog2 = new Blog();
blog1.alertInfo(); // jessiehttp://www.cnblogs.com/xiayu25/fr1,fr2,fr3,fr4
blog2.alertInfo(); // jessiehttp://www.cnblogs.com/xiayu25/fr1,fr2,fr3,fr4
blog1.name = 'test1';
blog1.url = 'http://***.com';
blog1.friend.pop();
blog2.name = 'test2';
blog2.url = 'http://+++.com';
blog1.alertInfo(); // test1http://***.comfr1,fr2,fr3
blog2.alertInfo(); // test2http://+++.comfr1,fr2,fr3
// 上面的代码通过blog1向blog1的属性friend添加元素时,
// blog2的friend属性的元素也跟着受影响,原因是在于blog1和blog2对象的friend属性引用的是同一个Array
// 对象,那么改变这个Array对象,另一个引用Array对象的属性自然也会受到影响
5.混合模式(原型模式 + 构造函数模式)
function Blog(name, url, friend) {
this.name = name;
this.url = url;
this.friend = friend;
}
Blog.prototype.alertInfo = function() {
alert(this.name + this.url + this.friend);
};
var blog1 = new Blog('jessie', 'http://www.cnblogs.com/xiayu25/', ['fr1', 'fr2', 'fr3']),
blog2 = new Blog('cuit', 'http://www.cuit.edu.cn', ['a', 'b']);
blog1.friend.pop();
blog1.alertInfo(); // jessiehttp://www.cnblogs.com/xiayu25/fr1,fr2
blog2.alertInfo(); // cuithttp://www.cuit.edu.cna,b
//属性私有后,改变各自的属性不会影响别的对象。
// 同时,方法也是由各个对象共享的。在语义上,这符合了面向对象编程的要求。
6.动态原型模式
动态原型模式将所有信息封装在了构造函数中,而通过构造函数中初始化原型(仅第一个对象实例化时初始化原型),这个可以通过判断该方法是否有效而选择是否需要初始化原型。
function Blog(name, url) {
this.name = name;
this.url = url;
if (typeof this.alertInfo != 'function') {
// 这段代码只执行了一次
alert('exe time');
Blog.prototype.alertInfo = function() {
alert(thia.name + this.url);
}
}
}
var blog1 = new Blog('jessie', 'http://www.cnblogs.com/xiayu25/'),
blog2 = new Blog('cuit', 'http://www.cuit.edu.cn');
// 可以看到上面的例子中只弹出一次窗,'exe time',即当blog1初始化时,
// 这样做blog2就不在需要初始化原型,对于使用这种模式创建对象,可以算是perfect了。
二、继承(主要是方法的继承和属性的继承)
function person(name, sex){
this.name=name;
this.sex=sex;
}
person.prototype.showName=function(){
alert(this.name);
};
person.prototype.showSex=function(){
alert(this.sex);
};
function worker(name,sex,job){
person.call(this,name,sex);//构造函数伪装 调用父级的构造函数--为了继承属性
this.job=job;
}
//原型链 通过原型来继承父级的方法
for(attr in person.prototype){
worker.prototype[attr]=person.prototype[attr];
}
worker.prototype.showJob=function(){
alert(this.job);
};
var op=new person('blue','女');
var ow=new worker('blue','女','程序员');
op.showName(); //blue
op.showSex(); //女
ow.showName(); //blue
ow.showSex(); //女
ow.showJob(); //程序员
//继承的好处:父类新加的功能,子类也具备该功能,子类新加的功能不会影响父类的功能
JS面向对象(封装,继承)的更多相关文章
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- js面向对象之继承那点事儿根本就不是事
继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- 捋一捋js面向对象的继承问题
说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...
- JS面向对象组件 -- 继承的其他方式(类式继承、原型继承)
继承的其他形式: •类式继承:利用构造函数(类)继承的方式 •原型继承:借助原型来实现对象继承对象 类 : JS是没有类的概念的 , 把JS中的构造函数看做的类 要做属性和方法继承的时候,要分开继 ...
- js面向对象之继承-原型继承
//animal 父类 超类 var Animal = function(name) { this.name = name; this.sayhello = function() { alert(&q ...
- JS——面向对象、继承
创建对象的方式: 1)单体 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Js面向对象构造函数继承
构造函数继承 <!-- 创建构造函数 --> function Animal(){ this.species= '动物'; } function Dog(name,color){ this ...
- js面向对象封装级联下拉菜单列表
本实例开发的级联下拉菜单是根据已有json数据创建的DOM元素.点击文本框后,显示一级菜单.如果菜单中包含子菜单,菜单右侧会有指示箭头.点击菜单之后,会再显示下一级菜单,以此类推.当菜单下无子菜单时, ...
随机推荐
- git push 每次都要输入用户名密码
添加远程库的时候使用了https的方式..所以每次都要用https的方式push到远程库,速度还慢.. 查看使用的传输协议: git remote -v 重新设置成ssh的方式: git remote ...
- 【AHOI2012】信号塔
题面 题解 xgzc怒切计算几何 最小圆覆盖板子题 整体算法如下: 枚举第一个点,考虑当前圆是否包含了这个点,如果没有,则把圆变成以这个点为圆心,半径为\(0\)的圆.再枚举第二个点,考虑圆是否包含了 ...
- P4774 [NOI2018]屠龙勇士
P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...
- SSIS 处理错误的方法
Package在执行过程中,不可避免地会发生错误,如果处理错误?简单粗暴的做法,是Package直接停止运行.对于一个成熟的ETL工具,这显然不是唯一的错误处理方法.如果在数据流中出现错误,那么数据流 ...
- 【ASP.NET Core】运行原理(1):创建WebHost
本系列将分析ASP.NET Core运行原理 [ASP.NET Core]运行原理[1]:创建WebHost [ASP.NET Core]运行原理[2]:启动WebHost [ASP.NET Core ...
- 使用MUART0-P-1-2设置无线PM2.5感测环境
信息搜集–> 处理分析–> 动作执行,这是IoT环境中最基本的组成要素,传感器搜集环境信息后,透过指定的通讯协议传送到至控制中枢,经过处理分析后再将命令送交各device端执行.要实现这样 ...
- netbeans 类重复 解决
Help -> About -> Cache directory 记录Cache directory目录 删除该目录下的所有文件 重启
- 2018Java年底总结
一年又过去了,这是我的第二年的JAVA开发,总感觉有很多想说的,可惜语言组织能力着实一般,以下列举一些今年的总结. 1.首先告诫一下新入行或者新入职经验不多的小伙伴,写sql的时候根据业务能单表就单表 ...
- Unity 几何着色器
Unity 几何着色器 shaderGeometry Shader几何着色器 Unity 几何着色器 如果学习不能带来价值,那将毫无意义 简介 在顶点和片段着色器之间有一个可选的着色器,叫做几 ...
- Controller组件- 集合点的功能-loadrunner
1.添加集合点功能的做法 ,注意在开始事务前加,不然就会把等待时间也加进去. 2.Controller 中也要开启集合点的功能,才能使用