JavaScript面向对象编程指南--读书笔记(下)

第六章:继承

原型链方法(防传统)

function Shape() {
  this.nama = 'Shape';
  this.toStrig = function() {
    rreturn this.name;
  }
}

function TwoDShape() {
  this.name = '2D shape';
}

function Triangle(side, height) {
  this.name = 'Triangle';
  this.side = side;
  this.height = height;
  this.getArea = function(){
    return  this.side*this.height / 2;
  }
}

TwoDShap.prototype = new Shape();
Triangle.prototype = new TwoDShap();

TwoDShap.prototype.constructor = TwoDShap;
Triangle.prototype.constructor = Triangle;

var my = new Triangle(5,6)
my.getArea (); // 25
my.toStrig(); //  Triangle

切记:JavaScript是一种完全依靠对象的语言,它没有类(class)的概念。因此我们需要new构造一个实体,然后这样才能通过该实体的属性完成相关的继承工作,而不能直接继承构造器。确保了在继承实现之后,我们队构造器进行任何的修改,并不会影响到原有者,我们只是继承了它的一个实例,最后还要对constructor进行重置。
强调:必须在扩展原型对象之前完成继承关系的构建。

只继承于原型法

出于对效率考虑,需要尽可能把一些可重用的属性和方法添加到原型中去,如养成这样的好习惯,我们可仅仅依靠原型就可完成继承关系。可作为一些改善

  • 不要单独为继承关系创建新对象;
  • 尽量减少运行时方法搜索。
 function Shape() { };
Shape.prototype.name = 'Shape';
Shape.prototype.toStrig = function() {
    rreturn this.name;
  };

function TwoDShape() { };
TwoDShape.prototyoe = Shape.prototype;
TwoDShap.prototype.constructor = TwoDShap;
TwoDShape.prototype.name = '2D shape';


function Triangle(side, height) {
  this.side = side;
  this.height = height;
}

Triangle.prototype = TwoDShape.prototyoe ;
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function(){
    return  this.side*this.height / 2;
  };

var my = new Triangle(5,6)
my.getArea (); // 25
my.toStrig(); //  Triangle

这种方法有个它的副作用,由于是子对象和父对象是共指用一个对象,所以,当子对象对其原型进行更改,父对象也会随即被更改,甚至所有的继承关系也是如此:

Triangle.prototype.name = 'Triangle';
Shape.prototype.name  // Triangle
//当我们再new一个实例对象时,新对象的属性也是name = 'Triangle'
var  s= new Triangle();
s.name // Triangle

所以这种运用在很多场景中并不适用。

临时构造器法——new F()

基于上面的方法,我们需要某种中介来打破父子原型的这种连锁关系,我们可以创建个F()空函数,通过new F()来创建一些不包含父对象属性的对象,同时又可以从父对象prototype属性中继承一切。

 function Shape() { };
Shape.prototype.name = 'Shape';
Shape.prototype.toStrig = function() {
    rreturn this.name;
  };

function TwoDShape() { };
var F = function () { };
F.prototype= Shape.prototype
TwoDShape.prototyoe = new F;
TwoDShap.prototype.constructor = TwoDShap;
TwoDShape.prototype.name = '2D shape';


function Triangle(side, height) {
  this.side = side;
  this.height = height;
}
var F = function () { };
F.prototype= TwoDShape.prototype
Triangle.prototyoe = new F;
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function(){
    return  this.side*this.height / 2;
  };

var my = new Triangle(5,6)
my.getArea (); // 25
my.toStrig(); //  Triangle

原型属性拷贝法

全属性拷贝法(即浅拷贝法)

深拷贝法

原型继承法

扩展与增强模式

多重继承法

寄生继承法

构造器借用法

构造器与属性拷贝法

第七章:浏览器环境

  • BOM(Browser Object Model 即浏览器对象模型)
  • DOM (Document Model 即文档对象模型)
  • 浏览器事件
  • XMLHttpRequest

BOM

BOM是一个用于访问浏览器和计算机屏幕的集合,可通过window全局对象来访问。

  • window.navigator:
    用于反应浏览器及其功能信息的对象。
  • windows.location:
    属于一个用于存储当前载入页面URL信息的对象,location.href 显示的是完整的URL,location.hostname则是显示相关的域名信息。
  • windows.history
    允许我们以有限的权限操作同一个浏览器会话(session)中的已访问的页面,例如:
window.history.length // 查看用户访问了多少的页面,基于隐私,无法获得具体的URL
window.history.forward() // 后退
window.history.back() // 前进
window.history.go() // 实现页面跳转 go(-1),go(-2), 类似back(), go(0) 当前页
  • window.frames
    当前页面中所有框架的集合,没有对iframe和frame进行区分。,而且当前页面中是否存在框架,其总是存在的,并指向window对象本身。

  • window.secreen
    提供的是浏览器以外的环境信息,例如,secreen.colorDepth属性包含当前显示器的色味。

  • window.open()/close()
    open()是一个可让我们打开新浏览器窗口的方法。
    close()则是关闭新窗口的。

  • window.moveTo()/resizeTo()

  • window.alert()、window.confirm()、window.prompt()

  • window.setTimeout()、window.setInterval()、window.clearTimeout()
    setTimeout() 用于在指定多少 毫秒数后执行某段既定代码;
    setInterval() 用于每隔一段毫秒数,执行某段指定代码;
    clearTimeout() 方法用于取消当前的计时器

DOM

是一种将XML或HTML文档解析成树形节点的方法。通过DOM的方法和属性我们可以访问到 页面上任何元素,进行元素的修改、删除、及添加等。

XMLHttpRequest对象

关于XMLHttpRequest对象的用法可分为两部分:

  • 发送请求——在这一步中,我们需要完成对XMLHttpRequest 对象的构建
  • 处理响应——在这一步中,事件监听器会在服务器的响应信息到达之时收到通知,然后相应的代码就会执行。

发送请求

var xhr = new XMLHttpRequest ();  //创建对象
xhr.onreadystatechage = mycallback; //为该对象设置一个能触发onreadystatechage 事件的监听器
xhr.open('GET' 'somfile.txt' true) // 调用open 方法
xhr.end(' ');

第一个参数指定HTML请求类型(GET、POST、HEAD)
第二参数是请求目标的URL
第三个参数是请求方式是否按照异步的方式进行
send()方法可用发送请求时附带上任何数据集,GET方式类发送方式这里带的是空字符串,因为它的数据都附带在URL里。
带请求发送出去之后,代码就可以将注意力转向其他地方,当收到服务器的响应后,会自动启动回调函数mycallback

处理响应

每一个XML对象中有readyState的属性,一旦我们改变了这个属性的值后,就会触发onreadystatechage 事件,readyState具有以下的状态值:

  • 0——未初始化状态
  • 1——载入请求状态
  • 2——载入完成状态
  • 3——请求交互状态
  • 4——请求完成状态

当readyState的值为4时意味服务器的响应信息已经返回,开始处理了,这时候还有处理一个HTTP状态码,正常情况下该HTTP状态码是200,该状态码可同过XML对象的status属性来获得。
当这两个条件都满足时我们就可以通过xhr.responseText来访问目标URL中的内容了。

function mycallback(){
  if(xhr.readyState < 4){
    return ; // not ready yet
  }
  if(xhr.status !== 200 ){
    alert('error');
    return ;
  }
  alert(xhr.resposeText)
}

以上额XHR对象属于全局域的,mycallback要根据这个全局对象的readyState、status、responseText属性,但我们异步发送两个请求,或者第二个请求的响应先于第一个,这个方式就不适用了,我们可以封装下这个回调函数到闭包里摆脱对全局对象的依赖。

var xhr = new XMLHttpRequest ();  //创建对象
xhr.onreadystatechage =(function(xhr){
      return function(){
       mycallback(xhr);      
    }
})(xhr);
xhr.open('GET' 'somfile.txt' true) // 调用open 方法
xhr.end(' ');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容