Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JavaScript 学习 - Object Basics

Posted on 2007-05-04 23:06 ZelluX 阅读(349) 评论(0)  编辑  收藏 所属分类: Web
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#start
http%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”, 423);
var oCar1 = createCar(“blue”, 325);
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”, 423);
var oCar2 = new Car(“blue”, 325);
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”, 423);
var oCar2 = new Car(“blue”, 325);
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”

学了不少,明天开始看继承,恩

只有注册用户登录后才能发表评论。


网站导航: