热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第1章面向对象的JavaScript

针对基础知识的每一个小点,我都写了一些小例子,https://github.com/huyanluanyu1989/DesignPatterns.git,便于大家理解,如有疑问,大家可留言给我

针对基础知识的每一个小点,我都写了一些小例子,https://github.com/huyanluanyu1989/DesignPatterns.git,便于大家理解,如有疑问,大家可留言给我,最近工作比较忙,可能更新会比较慢,大家多我原谅,有兴趣可以关注一下,后续我会尽快更新的,谢谢大家支持!!!



第一部分 基础知识

第1章 面向对象的Javascript



1.1 动态类型语言和鸭子类型

编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言。

静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。

鸭子类型(duck typing)的通俗说法是: 如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。

script type="text/Javascript"
var duck = {
duckSinging : function(){
console.log('嘎嘎嘎');
}
}
var chicken = {
duckSinging : function(){
console.log('嘎嘎嘎');
}
var choir = [];
var joinchoir = function(animal){
if(animal typeof(animal.duckSinging) === 'function'){
choir.push(animal);
console.log('恭喜加入合唱团');
console.log(choir.length);
}
}
joinchoir(duck);
joinchoir(chicken);
/script

1.2 多态

多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。

多态背后的思想是将 做什么 和 谁去做以及怎样去做 分离开来,也就是将 不变的事物 与 可能改变的事物 分离开来。把不变的部分隔离出来,把可变的部分封装起来。

script type="text/Javascript"
var makeSound = function (animal){
if(animal instanceof duck){
console.log("嘎嘎嘎");
}else if(animal instanceof chicken){
console.log("咯咯咯");
}
}
var duck = function(){};
var chicken = function(){};
makeSound(new duck);
makeSound(new chicken);
/script

1.3 封装

封装的目的是将信息隐藏。

封装数据:Javascript只能依赖变量的作用域来实现封装特性,而且只能模拟出 public 和 private 这两种封装性。

封装类型:是通过抽象类和接口来进行的。

封装变化:通过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开来,在系统的演变过程中,我们只需要替换那些容易变化的部分。

script type="text/Javascript"
var goolgeMap = {
show:function(){
console.log("谷歌地图")
}
}
var baiduMap = {
show:function(){
console.log("百度地图");
}
}
var renderMap = function(map){
if(map.show instanceof Function){
map.show();
}
}
renderMap(goolgeMap);
renderMap(baiduMap);
/script

1.4 原型模式和基于原型继承的 Javascript 对象系统

原型编程范型至少包括以下基本规则:

1. 所有的数据都是对象。

Javascript在设计的时候,模仿 Java 引入了两套类型机制:基本类型和对象类型。基本类型:undefined、number、boolean、string、function、object。除了 undefined 之外,一切都应是对象。

Javascript 中的根对象是 Object.prototype 对象。Object.prototype 对象就是它们的原型。

script type="text/Javascript"
var Plane = function(){
this.blood = 100;
this.attackLevel = 1;
this.defenseLevel = 1;
}
var plane = new Plane();
plane.blood=500;
plane.attackLevel=10;
plane.defenseLevel=7;
var clOnePlane= Object.create(plane);
console.log(clonePlane)
/script

2.要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。

script type="text/Javascript"
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
var objectFactory = function(){
var obj = new Object(); // 从 Object.prototype 上克隆一个空的对象
COnstrutor= [].shift.call(arguments);// 取得外部传入的构造器,此例是 Person
obj.__proto__ = Construtor.prototype;// 指向正确的原型
var ret = Construtor.apply(obj, arguments);// 借用外部传入的构造器给 obj 设置属性
return typeof ret === 'object' ? ret : obj ;// 确保构造器总是会返回一个对象
var a = objectFactory(Person, 'sven');
// var a = new Person('Remen')
console.log(a.name);
console.log(a.getName());
console.log(Object.getPrototypeOf(a) === Person.prototype);
/script

3.对象会记住它的原型。

对象把请求委托给它的构造器的原型。

4. 如果对象无法响应某个请求,它会把这个请求委托给它自己的原型。

在 Javascript 中,每个对象都是从 Object.prototype 对象克隆而来的,只能得到单一的继承关系,即每个对象都继承自 Object.prototype 对象,

在原型继承方面 ,Javascript也同样遵守这些原型编程的基本规则。

script
//一个类继承自另一个类时
var A = function(){};
A.prototype = {name : 'sven'};
var B = function(){};
B.prototype = new A();
var b = new B();
var a = new A();
console.log(b.name)
/script


   



推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
迪信通张磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有