js面向对象技术小结

  1. 对象是属性的无序集合,每个属性存放一个原始值、对象或函数,严格来说这意味着对象是无特定顺序的值的数组
  2. 类:可以看做是对象的配方
  3. 程序使用类创建对象时,生成的对象叫做类的实例。
  4. 一种面向对象语言需要向开发者提供四种基本能力

1)  封装-把相关的信息(无论数据或方法)存储在对象中的能力

2)  聚集-把一个对象存储在另一个对象内的能力

3)  继承-由另一个类(或多个类)得来类的属性和方法的能力

4)  多态-编写能以多种方法运行的函数或方法的能力

7.如果构造函数无参数,括号不是必须的。

8.每次创建对象,存储在变量中的都是该函数的引用,而不是对象本身

9.把对象的所有引用都设置为null,可以强制性地废除对象。

10.绑定:即把对象的接口与对象实例结合在一起的方法

1)  早绑定:是指在实例化对象之前定义它的属性和方法,这样编译器和解释器能够提前转换机器代     码(ECMAScript不支持早绑定)。

2)  晚绑定:值得是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查各对象     的类型,只需检查对象是否支持属性和方法即可。ECMAScript中的所有变量都采用晚绑定方法。这     样就允许执行大量的对象操作,而无任何惩罚。

11.一般来说,可创建并使用的对象有三种:本地对象、内置对象和宿主对象

1)  本地对象:独立于宿主环境的ECMASCript实现提供的对象。简而言之,本地对象就是ECMA-262定     义的类(引用类型)。他们包括:

2)  内置对象:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行     时出现。这意味着开发者不必明确实例化内置对象,它已被实例化了。有两个内置对象:Global和     Math(他们也是本地对象,根据定义每个内置对象都是本地对象)

3)  宿主对象:所有非本地对象都是宿主对象。所有的BOM和DOM对象都是宿主对象。

12.关键字this:this总是指向调用该方法的对象

使用this的原因是:实例化对象时,总不能确定开发者会使用什么样的变量名。使用this即可在任     何多个地方重用一个函数。eg:

functionshowColor() {

alert(this.color);

};

var oCar1= new Object;

oCar1.color= "red";

oCar1.showColor= showColor;

var oCar2= new Object;

oCar2.color= "blue";

oCar2.showColor= showColor;

oCar1.showColor();           //输出 "red"

oCar2.showColor();           //输出"blue"

注释:在上面的代码中,首先用 this 定义函数 showColor(),然后创建两个对象(oCar1 和          oCar2),一个对象的 color 属性被设置为 "red",另一个对象的 color 属性被设置为 "blue"。     两个对象都被赋予了属性 showColor,指向原始的 showColor () 函数(注意这里不存在命名问       题,因为一个是全局函数,而另一个是对象的属性)。调用每个对象的 showColor(),oCar1 输出     是 "red",而 oCar2 的输出是 "blue"。这是因为调用 oCar1.showColor() 时,函数中的 this 关     键字等于 oCar1。调用 oCar2.showColor() 时,函数中的 this 关键字等于 oCar2。

12.字符串连接:ECMAScript 的字符串是不可变的,即它们的值不能改变。请考虑下面的代码:

var str ="hello ";

str += "world";

实际上,这段代码在幕后执行的步骤如下:

1)创建存储 "hello " 的字符串。

2)创建存储 "world" 的字符串。

3)创建存储连接结果的字符串。

4)把 str 的当前内容复制到结果中。

5)把 "world" 复制到结果中。

6)更新 str,使它指向结果。

每次完成字符串连接都会执行步骤 2 到 6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用 Array 对象存储字符串,然后用 join() 方法(参数是空字符串)创建最后的字符串。想象用下面的代码代替前面的代码:

var arr =new Array();

arr[0] ="hello ";

arr[1] ="world";

var str =arr.join("");

这样,无论数组中引入多少字符串都不成问题,因为只在调用 join() 方法时才会发生连接操作。此时,执行的步骤如下:

创建存储结果的字符串

把每个字符串复制到结果中的合适位置

虽然这种解决方案很好,但还有更好的方法。问题是,这段代码不能确切反映出它的意图。要使它更容易理解,可以用 StringBuffer 类打包该功能:

functionStringBuffer () {

this._strings_ = new Array();

}

StringBuffer.prototype.append= function(str) {

this._strings_.push(str);

};

StringBuffer.prototype.toString= function() {

return this._strings_.join("");

};

这段代码首先要注意的是 strings 属性,本意是私有属性。它只有两个方法,即 append() 和 toString() 方法。append() 方法有一个参数,它把该参数附加到字符串数组中,toString() 方法调用数组的 join 方法,返回真正连接成的字符串。要用 StringBuffer 对象连接一组字符串,可以用下面的代码:

varbuffer = new StringBuffer ();

buffer.append("hello");

buffer.append("world");

varresult = buffer.toString();

可用下面的代码测试StringBuffer 对象和传统的字符串连接方法的性能:

var d1 =new Date();

var str ="";

for (vari=0; i < 10000; i++) {

str += "text";

}

var d2 =new Date();

document.write("Concatenationwith plus: "

+ (d2.getTime() - d1.getTime()) + "milliseconds");

varbuffer = new StringBuffer();

d1 = newDate();

for (vari=0; i < 10000; i++) {

buffer.append("text");

}

varresult = buffer.toString();

d2 = newDate();

document.write("<br/>Concatenation with StringBuffer: "

+ (d2.getTime() - d1.getTime()) + "milliseconds");

这段代码对字符串连接进行两个测试,第一个使用加号,第二个使用 StringBuffer 类。每个操作都连接 10000 个字符串。日期值 d1 和 d2 用于判断完成操作需要的时间。请注意,创建 Date 对象时,如果没有参数,赋予对象的是当前的日期和时间。要计算连接操作历经多少时间,把日期的毫秒表示(用 getTime() 方法的返回值)相减即可。这是衡量 JavaScript 性能的常见方法。该测试的结果应该说明使用 StringBuffer 类比使用加号节省了 50% - 66% 的时间。

时间: 2024-11-04 21:18:04

js面向对象技术小结的相关文章

简单粗暴地理解js原型链--js面向对象编程

简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗

前端html、Javascript、CSS技术小结

简单地总结了一下前端用过的html.javascript.css技术,算是清点一下,做个大略的小结,为进一步的学习给个纲领. 一.HTML 由于HTML5的兴起,简单地判断一个网页是否是html5网页,只需要找找内部是否有html5的标志性标签就行了.然而平时虽然写了不少html,却没怎么关注它的发展史: GML(Generalized Marcup Language)通用标记语言 和SGML(Standard Generalized Markup Language)标准通用标记语言. 由Tim

面向对象技术概论

面向对象理论很早就被提出了,但它真正地渗透到软件开发的各个领域,并且在软件开发实践中大规模应用,却要等到上世纪九十年代.到目前为止,面向对象技术已是软件开发的主流,全面取代了结构化编程技术曾经具有的地位. 面向对象技术与结构化编程技术有着不同的风格,但同时也有着密切的联系.从具体编程角度来看,面向对象技术与结构化编程技术很难截然分开,两者的根本差别在于思维 方式. 要了解面向对象技术,得从结构化编程技术入手. 1.1结构化编程引例 结构化编程在上世纪七十年代兴起,由于它具有很多的优点,出现之后没

一、面向对象技术概论(上)

面向对象理论很早就被提出了,但它真正地渗透到软件开发的各个领域,并且在软件开发实践中大规模应用,却要等到上世纪九十年代.到目前为止,面向对象技术已是软件开发的主流,全面取代了结构化编程技术曾经具有的地位. 面向对象技术与结构化编程技术有着不同的风格,但同时也有着密切的联系.从具体编程角度来看,面向对象技术与结构化编程技术很难截然分开,两者的根本差别在于思维方式. 要了解面向对象技术,得从结构化编程技术入手. 1.1.结构化编程引例  结构化编程在上世纪七十年代兴起,由于它具有很多的优点,出现之后

JS面向对象(2)——原型链

原型链用于ECMAScript的继承.其思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.说人话,我们知道,一个构造函数Subtype,其原型对象有一个指向构造函数的指针,这是联系构造函数和原型的桥梁,如果我让原型对象的指针指向了另一个原型,而另一个原型原本指向其构造函数的指针也指向了另一个原型,那么,这就是一个原型链了,原型上的属性会一层一层往下传递. function SuperType(){ this.property=true; } SuperType.prototype.ge

一、面向对象技术概论(下)

1.2 面向对象的核心概念 从理论上说,面向对象技术拥有四大基本特性. (1)封装 这是一种隐藏信息的特征.拿上节引例来说,类CalculateDate将数据结构与算法隐藏在类的内部,外界使用者无需知道具体技术实现细节即可使用此类.封装这一特性不仅大大提高了代码的易用性,而且还使得类的开发者可以方便的更换新的算法,这种变化不会影响使用类的外部代码.可以用以下公式展示类的封装特性: 封装的类=数据+对此数据所进行的操作(即算法) 通俗的说,封装就是:包起外界不必需要知道的东西,只向外界展露可供展示

你的面向对象技术在哪个级别?

你的面向对象技术在哪个级别? 怎样才算掌握OOP 1. 能把面向对象和具体语言的对象抽象联系起来 在面向对象刚刚入门的时候,一大顿理论加上解释又是只言片语,什么原则,方法等根本好像是没有用的嘛.唯一看明白的就是对象,类就是Class. 在编程的时候,碰到一个名词就把它写成class,以为这就是面向对象编程.拿图书馆案例来讲,初步分析后可能就把我们的学生Student作为我们的 Class来编程,并设计了它的属性,方法和操作,具体来说就是给Student加上了name属性,借书方法等. 仿佛面向对

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构

大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认知方式和思考方式.对于复杂的事物,人类是如何去认识.归纳.总结的?面向对象式编程就是在努力回答这个问题,而答案的核心就是两个字:抽象.所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中.因为我们开发软件就是为了解决问题,面向对象式编程符合人类对于“问题”的认知方式),因为我早