在六月份找工作中,被问的最多的问题就是: 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面向对象(封装,继承)的更多相关文章

  1. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  2. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  3. js面向对象之继承那点事儿根本就不是事

    继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...

  4. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  5. 捋一捋js面向对象的继承问题

    说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...

  6. JS面向对象组件 -- 继承的其他方式(类式继承、原型继承)

    继承的其他形式: •类式继承:利用构造函数(类)继承的方式 •原型继承:借助原型来实现对象继承对象   类 : JS是没有类的概念的 , 把JS中的构造函数看做的类 要做属性和方法继承的时候,要分开继 ...

  7. js面向对象之继承-原型继承

    //animal 父类 超类 var Animal = function(name) { this.name = name; this.sayhello = function() { alert(&q ...

  8. JS——面向对象、继承

    创建对象的方式: 1)单体 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  9. Js面向对象构造函数继承

    构造函数继承 <!-- 创建构造函数 --> function Animal(){ this.species= '动物'; } function Dog(name,color){ this ...

  10. js面向对象封装级联下拉菜单列表

    本实例开发的级联下拉菜单是根据已有json数据创建的DOM元素.点击文本框后,显示一级菜单.如果菜单中包含子菜单,菜单右侧会有指示箭头.点击菜单之后,会再显示下一级菜单,以此类推.当菜单下无子菜单时, ...

随机推荐

  1. 20155202 2016-2017-2 《Java程序设计》第9周学习总结

    20155202 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 整合数据库: JDBC驱动程序,按照方式分4种类型: Type1 : JDBC-ODBC B ...

  2. python基础学习1-装饰器在登陆模块应用

    LOGIN_USER ={"islogin":False} def outer(func): def inner(*args,**kwargs): if LOGIN_USER[&q ...

  3. 关于iptables命令

    iptables 指令语法:iptables [-t table] command [match] [-j target/jump]-t 参数用来指定规则表,内建的规则表有三个,分别是:nat.man ...

  4. JavaScript快速查找节点

    我们在实际的开发中,经常要获取页面中某个html元素,动态更新元素的样式.内容属性等. 我们已经知道在JavaScript中提供下面的方法获取子.父.兄节点的方法: 常规 通过父节点获取子节点: pa ...

  5. asp.net core发布到docker报Microsoft.ApplicationInsights.AspNetCore miss的错误

    dotnet core 2.1的asp.net core在docker下部署的时候发生下面的错误. Error: An assembly specified in the application de ...

  6. 12只超酷机器人,在家用3D打印搞定!

    3D打印最吸引人的地方在于它完全无极限!现在的3D打印已经广范应用在我们的生活.以及工业上的各个领域.最棒的是,DIY玩家可以真正从中受益.我们现在已经可以应用3D打印,在家制作自己的机器人了.如果你 ...

  7. Mysql启动失败解决方案 - 个人经验可能不适合所有场景

    以前一直用的Mysql5.5,安装程序是一个exe程序,安装完了相应的服务也给我注册好了,然后直接启动连接即可. 最近升级到了8.0.15,发现和以前不一样了. 8.0.15下载地址 安装解压之后目录 ...

  8. PLSQL函数,存储过程

    --创建一个函数,用来根据部门编号返回调薪幅度 create or replace function get_ratio_by_dept(deptno varchar2) return number ...

  9. GearCase UI - 自己构建一套基于 Vue 的简易开源组件库

    最近 1 ~ 2 月除了开发小程序之外,还一直在继续深入的学习 Vuejs.利用零碎.闲暇的时间整合了一套基于 Vue 的 UI 组件库.命名为 GearCase UI,意为齿轮盒.现在把该项目进行开 ...

  10. Gitlab CI-3.遇到的问题

    五.遇到的问题 1. cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 报错信息:ERROR ...