《JavaScript设计模式与开发》笔记 1.面向对象的JavaScript

  • 多态
  • 封装
  • 原型模式
  • 基于原型模式的继承javascript对象

1.多态

多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发哦少年宫同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。 多态最根本的作用就是吧通过过程化的条件分子语句转换为对象的多态性,从而消除这些条件分支语句。

var googleMap = {
    show:function(){
        console.log("开始渲染Google地图");
    }
};
var baiduMap={
    show :function () {
        console.log(‘开始渲染百度地图‘);
    }
};
//如果要添加一个搜搜地图
var sosoMap={
    show:function(){
        console.log(‘开始渲染搜搜地图‘);
    }
}

var renderMap = function(map){
    if(map.show instanceof Function){
        map.show();
    }
}
renderMap(googleMap);

renderMap(sosoMap);

2.封装

封装的目的是将信息隐藏,封装应该被视为“任何形式的封装”,也就是说,封装不仅仅是隐藏数据,还包括隐藏实现细节,设计细节以及隐藏对象类型等。

var myObject = (function(){
    var _name = ‘SarmTom‘;  //私有成员变量
    return {                //公开public方法
      getName:function(){
          return _name;
      }
    };
})
 

我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的原型对象。使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中

function Person(){};
Person.prototype.name = ‘SmarTom‘;
Person.prototype.age = 29;
Person.prototype.job = "Soft Engineer";
Person.prototype.syaName=function(){
    console.log(this.name);
}
var a = new Person();
a.syaName();

使用克隆原型的模式

var Plane = function(){
    this.blood = 100;
    this.attackLevel = 1;
    this.defenseLevel = 1;
}
var plan = new Plan();
plan.blood = 500;
plane.attackLevel = 10;
plane.defenseLevel = 7;

var clonePlan = Object.create(plane);
console.log(clonePlan); //输出:Object{blood:500,atackLevel:10,defenseLevel:7}
//在不支持Object.create方法的浏览器中,则可以使用一下代码
/*
Object.create = Object.create || function(object){
    var F = function(){};
    F.prototype = obj;
    return new F();
}
*/

3.JavaScript中的原型继承

  • 所有的数据都是对象。
  • 要得到一个对象,不是通过实例化,而是找到一个对象原型并克隆它。
  • 对象会记住它的原型。
  • 如果对象无法响应某个请求,它会把这个请求委托给自己的原型。
1.所有数据都是对象

JavaScript除了undefined之外,一切都是对象,为了 实现
这个目标,number,boolean,string,这几种基本类型数据
也可以通过“包装类”的方式编程对象类型的数据处理。

事实上,javascript中的跟对象Object.prototype对象。Object.prototype对象是一个空的对象。
我们再JavaScript中遇到的每一个对象,实际上都是从Object.prototype对象克隆出来的,
Object.prototype对象就是它们的原型。比如

 

var obj1 = new Object();
var obj2 = {};
2.要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。

function Person(name){
    this.name = name;
}
Person.prototype.getName = function(){
    return this.name;
}

var a = new Person(‘SmarTom‘);

console.log(a.name);        //SmarTom
console.log(a.getName());   //SmarTom
console.log(Object.getPrototypeOf(a)==Person.prototype); //true
在JavaScript中没有类的概念,在这里Person并不是类,而是函数构造器,JavaScript函数既可以作为普通函数被调用,也可以作为构造器被调用。
当使用new运算符来调用函数时,此时的函数就是一个构造器。
用new运算符来创建对象的过程,实际上也只是先克隆Object.prototype对象,在进行一些其它操作的过程。
3.对象会记住它的原型
JavaScript给对象提供了一个名为__proto__的隐藏属性,某个属性的__proto__属性会指向它的构造器的原型对象,即{Constuctor}.prototype。
var a = new Object();
console.log(a.__proto__ ===Object.prototype);  //结果为true
 4.如果对象无法响应某个请求,它会把这个请求委托给它的构造器的原型
var obj = {name:‘SmarTom‘};
var A = function(){};
A.prototype = obj;
var a = new A();
console.log(a.name);

我们来看这段代码解释器做了哪些事情:

  • 首先,尝试遍历执行a中的所有属性,但没有找到name这个属性
  • 查找name属性的这个请求被委托给对象a的构造器的原型,它被a.__proto__记录着并且指向A.prototype,而A.prototype被设置成为对象Obj;
  • 在对象obj中查找到了name属性,并返回它的值。
var A = function(){};
A.prototype = {name:"SmarTom"};

var B = function(){};
B.prototype = new A();

var b = new B();
console.log(b.name); //输出SmarTom

在看这段代码执行的时候,引擎做了那些事情

  • 首先,尝试遍历b中的属性,但没有找到name这个属性。
  • 查找name属性的请求被委托给对象B的构造器的原型,它被b.__proto__记录着并且指向B.prototype,而B。prototype被设置为一个通过new A()创建的对象。
  • 在该对象中依然没有找到name属性,于是请求被继续委托给这个对象构造器的原型A.prototype。
  • 在A.prototype中找到了name属性,并返回它。

最后还要留意一点,原型链并不是无限长的。现在我们尝试访问对象a的address属性。对象b和它的构造器原型上没有address属性,那么这个请求最终会被返回为undefined。

时间: 2024-08-25 13:40:16

《JavaScript设计模式与开发》笔记 1.面向对象的JavaScript的相关文章

Day_18.《JavaScript设计模式与开发实践》-面向对象的JavaScript

设计模式 面向对象 动态类型语言 编程语言按照数据类型大体分为:静态类型语言和动态类型语言. 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行时,待变量被赋予某个值之后,才会具有某种类型. 在JavaScript中,当我们对一个变量赋值时,显然不需要考虑它的类型,因此JavaScript是一门典型的动态类型语言. 动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性,由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法

《JavaScript设计模式与开发实践》读书笔记之观察者模式

1.<JavaScript设计模式与开发实践>读书笔记之观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观察者模式 以客户看房为例 首先指定谁充当发布者,如售楼处 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者.这里为了让订阅者只接收自己感兴趣的消息,增加一个标识key 最后发布消息时候,发布者遍历缓存列表,依次触发里面存放的订阅者的回

JavaScript 设计模式与开发实践读书笔记 http://www.open-open.com/lib/view/open1469154727495.html

JavaScript 设计模式与开发实践读书笔记 最近利用碎片时间在 Kindle 上面阅读<JavaScript 设计模式与开发实践读书>这本书,刚开始阅读前两章内容,和大家分享下我觉得可以在项目中用的上的一些笔记. 我的 github 项目会不定时更新,有需要的同学可以移步到我的 github 中去查看源码: https://github.com/lichenbuliren/design-mode-notes 1.currying 函数柯里化 currying 又称 部分求值 .一个 cu

【摘】JavaScript设计模式与开发实践--单例模式

本文章所有内容均摘自<Javascript设计模式与开发实践>一书(有兴趣的可以购买),加入了一点点自己的理解,写这篇文章的目的是,加强自身对设计模式的理解,以及对于没有接触过这一块的入门者的参考. 阅读本章内容,需要具备Javascript面向对象的知识,否则阅读起来可能会些许困难. 设计模式 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者模式 装饰者模式 状态模式 适配器模式 单例模式 单例模式的定义:保证一个类仅有

JavaScript设计模式与开发实践——JavaScript的多态

"多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果.换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈. 从字面上来理解多态不太容易,下面我们来举例说明一下. 主人家里养了两只动物,分别是一只鸭和一只鸡,当主人向它们发出"叫"的命令时,鸭会"嘎嘎嘎&q

JavaScript设计模式与开发实践【第一部分】

今天开始阅读<JavaScript设计模式与开发实践>,对于设计模式的学习一直渴望已久. 设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案. 其实平时在工作中不知不觉在使用某些设计模式,只是我们不知道而已. 动态类型语言和静态类型语言 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时 候,待变量被赋予某个值之后,才会具有某种类型. 静态类型语言的优点首先是在编译时就能发现类型不匹配的错误,编辑器可以帮助我们提前 避免程序在运行期间有可

JavaScript设计模式与开发实践 – 观察者模式 http://web.jobbole.com/87809/

概述 观察者模式又叫发布 – 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做发布者).发布者的状态发生变化时就会通知所有的订阅者,使得它们能够自动更新自己. 观察者模式的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式. 观察者模式的中心思想就是促进松散耦合,一为时间上的解耦,二为对象之间的解耦.让耦合的

【读书】JavaScript 设计模式与开发实践

2016.08.30 <JavaScript 设计模式与开发实践> 曾探 人民邮电出版社 2016年5月第1版 p13 找到变化的部分并封装之,以使得容易替换:而剩下的就是不变的部分. P49 函数柯里化(currying)的作用是多次收集参数,然后作为数组传给处理函数再一次执行. 其意义在于预处理--将预处理的流程放到一个函数里会更为清晰可控. P57 惰性加载函数 在函数内部重写引用函数的外部变量的引用,从而在第一次"调用"此变量后,此变量就指向新的正确的函数. p84

JavaScript设计模式与开发实践 – 观察者模式

概述 观察者模式又叫发布 – 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做发布者).发布者的状态发生变化时就会通知所有的订阅者,使得它们能够自动更新自己. 观察者模式的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式. 观察者模式的中心思想就是促进松散耦合,一为时间上的解耦,二为对象之间的解耦.让耦合的

JavaScript设计模式与开发实践-读书笔记(3)闭包和高阶函数

闭包(closure) 闭包的形成与变量的作用域以及变量的生存周期密切相关. 变量的作用域,就是指变量的有效范围. 全局变量和局部变量. 在JavaScript中,函数可以用来创造函数作用域. 变量的生存周期,全局变量的生命周期是永久的,除非我们主动销毁这个全局变量. 对于在函数体内用var关键字声明的局部变量来说,当退出函数时,这些局部变量即失去了它们的价值,它们都会随着函数调用的结束而被销毁. 利用闭包我们可以完成许多奇妙的工作. 闭包的作用: 1.封转变量 闭包可以帮助我们把一些不需要暴露