在六月份找工作中,被问的最多的问题就是: 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. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

  2. 20155338《网络对抗技术》 Exp1 PC平台逆向破解

    20155338<网络对抗技术> Exp1 PC平台逆向破解 实践目标 1.实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo函 ...

  3. windows7 64位机上安装配置CUDA7.5(或8.0)+cudnn5.0操作步骤

    按照官网文档 http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#axzz4TpI4c8v ...

  4. 400 bad Request: JackSon将json串转成List<Object>,异常com.fasterxml.jackson.databind.JsonMappingException

    最近遇到的400, 以前总以为 400 就是参数不匹配造成的,直到今天遇到这个问题 控制台报错如下:  com.fasterxml.jackson.databind.JsonMappingExcept ...

  5. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  6. 通过IDEA解决spring配置文件

    来自:https://blog.csdn.net/yanghanxiu/article/details/79366263 (其实尼可以使用springboot 这样就不用配置一大堆东西了喵!) 每次创 ...

  7. JAVA 调用gc机制强制删除文件

    在删除文件前调用System.gc()方法,也就是垃圾回收机制,即可成功删除被JAVA虚拟机占用的文件.

  8. 并发系列(二)----Java内存模型

    一 简介 在并发编程中,两个线程(A.B)同时操作一个普通变量的时候会出现线程A在操作变量时线程B也将变量操作了,此时线程A是无法感知变量发生变化的,造成变量改变错误.更据以上例子我们需要解决的问题就 ...

  9. Unity扩展编辑器一

    将Test1脚本挂在摄像机上 ​ 如图展示 ​ 下面我们需要在代码中动态的编辑它,请在你的Project视图中创建一个Editor文件夹,把MyEditor放进Editor文件夹中 ​ 在OnInsp ...

  10. opengl-glsl

    GLSL 着色器是使用一种叫GLSL的类C语言写成的.GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性. 着色器的开头总是要声明版本,接着是输入和输出变量.uniform和mai ...