1. 面向对象语言的四个要素:封装、聚合(Aggregation)、继承、多态。
ps. Aggragation - the capability to store one object inside of another object
(貌似这本书并没有区分Object-based和Object-oriented)
2. 创建对象
基本和Java一样,但对于无参构造器,也可以使用类似Delphi的没有括号的语法。
var oStringObject = new String;
3. ECMAScript也有垃圾收集机制,不过早期版本的浏览器不支持。
4. 由于弱类型机制,ECMAScript不支持早期绑定,因此对象的方法和属性可以在运行期定义。
5. ECMA-262定义的基础类:
Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
6. String类的方法:
join, split, concat, slice, push(), pop(), shift(), unshift(), reverse(), sort() 方法略,还有个貌似挺麻烦的splice方法。
7. Data类
翻了下,发现显示当前时间只要
new Date().toLocaleTimeString()就行了,写Project2时土了
8. Global类
因为在JavaScript中并没有单独存在的函数,所有的函数都必须是已经存在的对象所属的函数。
于是有了Global类,包含所有“独立”函数的类。
貌似Global类的函数比较有用
a)
var sUri = “http://www.wrox.com/illegal value.htm#start”;
alert(encodeURI(sUri));
alert(encodeURIComponent(sUri));
输出:
http://www.wrox.com/illegal%20value.htm#starthttp%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start
区别在于encodeURI不处理属于URI的特殊字符,如;/?:;而encodeURIComponents处理所有特殊字符。
相应的有decodeURI和decodeURIComponents方法。
b)
eval 方法
很强大,但要小心使用,容易被注入恶意代码。
9. Math 类
用的时候再查API吧。。。
10. 作用域
a) JavaScript 所有的元素都是public的。无疑这会增加编程的难度,于是有了一种约定,即用两个下划线修饰命名“私有”变量。如
obj.__color__= "red";
就表示color是obj的一个私有变量(注意这只是一个约定,意味着其他程序员不应该使用这个变量)
也有写成obj._color的。
b) JavaScript 也没有严格意义上的static域。
function sayHi() {
alert(“hi”);
}
sayHi.alternate = function() {
alert(“hola”);
};
sayHi(); //outputs “hi”
sayHi.alternate(); //outputs “hola”
这里,alternate实际上是函数sayHi的一个方法。
11. 还是创建对象
由于JavaScript并没有提供真正意义上的构造方法,开发者们使用了不同的模式创建对象(怎么老觉得JavaScript这个语言是开发者在不断适应它,而不是它不断适应开发者呢 -,-)
a) Factory
function createCar(sColor, iDoors, iMpg) {
var oTempCar = new Object;
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = function () {
alert(this.color)
};
return oTempCar;
}
var oCar1 = createCar(“red”, 4, 23);
var oCar1 = createCar(“blue”, 3, 25);
oCar1.showColor(); //outputs “red”
oCar2.showColor(); //outputs “blue”
另外也可以把showColor这个方法在外部声明,然后使用oTempCar.showColor = showColor;
b) Constructor
function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function () {
alert(this.color)
};
}
var oCar1 = new Car(“red”, 4, 23);
var oCar2 = new Car(“blue”, 3, 25);
c) Protopype
function Car() {
}
Car.prototype.color = “red”;
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function () {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
这种模式的好处在于,允许instanceof操作符进行类型判断。但也有缺陷,例如
function Car() {
}
Car.prototype.color = “red”;
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.drivers = new Array(“Mike”, “Sue”);
Car.prototype.showColor = function () {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push(“Matt”);
alert(oCar1.drivers); //outputs “Mike,Sue,Matt”
alert(oCar2.drivers); //outputs “Mike,Sue,Matt”
原因在于prototype的drivers是所有Car共享的一个对象。
d) constructor和prototype的结合
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 oCar1 = new Car(“red”, 4, 23);
var oCar2 = new Car(“blue”, 3, 25);
oCar1.drivers.push(“Matt”);
alert(oCar1.drivers); //outputs “Mike,Sue,Matt”
alert(oCar2.drivers); //outputs “Mike,Sue”
That's more like it.
内存没有浪费,也没有因为共享对象的问题,也可以使用instanceof操作符。
e) 貌似还不够 --动态创建
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;
}
}
这样就产生了类似static的效果,Car.prototype的内容只需在第一次创建对象时被初始化。
f) 改版后的Factory模式
function Car() {
var oTempCar = new Object;
oTempCar.color = “red”;
oTempCar.doors = 4;
oTempCar.mpg = 23;
oTempCar.showColor = function () {
alert(this.color)
};
return oTempCar;
}
不建议使用,除非实在需要(貌似和XML有关)
12. 修改对象
比较简单,直接帖几个例子
Object.prototype.showValue = function () {
alert(this.valueOf());
};
var str = “hello”;
var iNum = 25;
str.showValue(); //outputs “hello”
iNum.showValue(); //outputs “25”
Function.prototype.toString = function () {
return “Function code hidden”;
};
//The previous code is perfectly legal and works as expected:
function sayHi() {
alert(“hi”);
}
alert(sayHi.toString()); //outputs “Function code hidden”
学了不少,明天开始看继承,恩