1. 一个完整的JavaScript实现的3个不同组成部分
核心(ECMAScript)
文档对象模型(DOM)
浏览器对象模型(BOM)
2. ECMAScript可以为不同种类的宿主环境提供核心的脚本编程能力,是与任何特定的宿主环境分开进行规定的。
个人理解:跨浏览器
ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性、方法和对象。其他的语言可以实现ECMAScript来作为
功能的基准。每个浏览器都有它自己的ECMAScript接口的实现。
3. DOM是HTML和XML的应用程序接口API。DOM将整个页面规划成由节点层级构成的文档。
DOM通过创建树来表示文档,从而使开发者对文档的内容和结构具有空前的控制力。用DOM API可以轻松的删除、添加和替换节点。
4. BOM可以对浏览器窗口进行访问和操作。开发者可以移动窗口。改变状态栏中的文字以及执行其他与页面内容不直接相关的内容。
5.ECMAScript的5种原始类型:
Undefined 变量未初始化 或 未声明的变量 或 函数没有返回值
Null undefined实际上是从值null派生来的 null ==undefined 为true
Boolean
6. 不能文的规约: 用单下划线说明私有成员 例如obj._color
7. 关键字总是指向调用该方法的对象。
function showColor()
{
alert(this.color);
}
var oCar=new Object;
oCar.color="red"; 相当于增加一个public的成员变量
oCar.shoColor=showColor; 相当于增加一个public的成员函数
var oCar2=new Object;
oCar2.color="blue";
oCar2.shoColor=showColor;
oCar.shoColor();
oCar2.shoColor();
8. 构造函数的方式
function Car(sColor,iDoors,iMpg){
this.color=sColor;
this.doors=iDoors;
this.mpg=iMpg;
this.showColor=function (){
alert(this.color);
}
}
var car1= new Car("red",4,23);
var car2= new Car("blue",3,25);
car1.showColor();
car2.showColor();
构造函数内部无创建对象。使用new运算符调用构造函数时,在执行第一行代码前先创建一个对象,只有用this才能访问该对象,然后直接赋予this属性,默认情况下是构造函数的返回值。不必明确使用return运算符。
缺陷:为每个对象创建独立的函数版本。
9. 原型方式
function Car()
{
}
Car.prototype.color="red";
Car.prototype.doors=4;
Car.prototype.mpg=23;
Car.prototype.showColor=function (){
alert(this.color);
}
var car1=new Car();
car1.showColor();
var car2=new Car();
car2.showColor();
缺陷:构造函数没有参数。当属性指向的是对象,而不是函数是,改变对象,另一个也会受影响
10. 混合的构造函数/原型方式
function Car(sColor,iDoors,iMpg)
{
this.color=sColor;
this.doors=iDoors;
this.mpg=iMpg;
this.drivers= new Array("Mike","Sue");
}
Car.prototype.showColor=function (){
alert(this.color);
}
var car1= new Car("red",4,23);
var car2= new Car("blue",3,25);
car1.drivers.push("Matt");
alert(car1.drivers);
alert(car2.drivers);
用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性。则所有对象只创建一次,而每个对象都具有自己的对象属性实例。
缺陷:在构造函数内找属性,在构造函数外找方法的做法不合理
11. 动态原型方法
function Car(sColor,iDoors,iMpg)
{
this.color=sColor;
this.doors=iDoors;
this.mpg=iMpg;
this.drivers= new Array("Mike","Sue");
if(typeof Car._initialized=="undefined"){
Car.prototype.showColor=function (){
alert(this.color);
}
Car._initialized=true;
}
}
12. 可以用prototype属性为任何已有的类定义新方法,就像处理自己的类一样。
如果想给每个本地对象添加新方法,必须在Object对象的prototype属性上定义它。
Object.prototype.showValue=function (){
alert(this.valueOf());
}