書中避開雞肋與糟粕,只討論精華部門,不談DOM與HTML,只關注語言本身。
JavaScript的確是一種非常優雅的語言,直接用代碼錶示吧。
以下代碼摘自《JavaScript語言精粹》,大多表現著一種基於原型的弱類型語言的特性,
經過調試,略有修改。
//給類型加方法
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
//執行個體化一個建構函式
if(typeof Object.beget !=='function'){
Object.beget=function(o){
var F=function () {};
F.prototype=o;
return new F();
};
}
//異常處理
try{
document.writeln(document.body.childNodes);
}
catch(e){
document.writeln(e.name+':'+e.message);
}
//閉包
var add_the_handlers=function (nodes){
var i;
for(i=0;i<nodes.length;i+=1){
nodes[i].onclick=function (i){
return function (e){
alert(i);
};
}(i);
}
};
add_the_handlers(document.body.childNodes);
//模組
String.method('deentityify', function () {
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
return function () {
return this.replace(/&([^&;]+);/g,
function (a,b){
var r=entity[b];
return typeof r==='string'?r:a;
}
);
};
} ()
);
document.writeln('<br>');
document.writeln('<">'.deentityify());
document.writeln('123'.deentityify());
//偽類
Function.method('new', function () {
var that = Object.beget(this.prototype);
var other = this.apply(that, arguments);
return (typeof other === 'object' && other) || that;
});
var Mammal = function (name) {
this.name = name;
this.age = 1;
};
Mammal.prototype.get_name = function () {
return this.name;
};
Mammal.prototype.says = function () {
return this.saying || '';
};
Mammal.prototype.get_age = function () {
return this.age;
};
var myMammal = new Mammal('Herb the Mammal');
var name = myMammal.get_name(); //可以訪問到name屬性
//var Cat = function (name) {
// this.name = name;
// this.saying = 'meow';
//};
//Cat.prototype = new Mammal();
//Cat.prototype.purr = function (n) {
// var i, s = '';
// for (i = 0; i < n; i++) {
// if (s) {
// s += '-';
// }
// s += 'r';
// }
// return s;
//};
//Cat.prototype.get_name = function () {
// return this.says() + ' ' + this.name + ' ' + this.says();
//};
//現在除了特定的外,還是可以訪問到私人屬性。
//定義inherits方法,以實現繼承偽類
Function.method('inherits', function (Parent) {
this.prototype = new Parent();
return this;
});
var Cat = function (name) {
this.name = name;
this.saying = 'meow';
} .inherits(Mammal).method('purr', function (n) {
var i, s = '';
for (i = 0; i < n; i++) {
if (s) {
s += '-';
}
s += 'r';
}
return s;
}).method('get_name', function () {
return this.says() + ' ' + this.name + ' ' + this.says();
});
var myCat = new Cat('Henrietta');
var says = myCat.says(); //'meow'
var purr = myCat.purr(5); //'r-r-r-r-r'
var name = myCat.get_name(); //'meow Henrietta meow'
var name1 = myCat.name;
//var age1 = mycat.get_age();//無法訪問父類方法
document.writeln('<br>');
document.writeln(says + ' ' + purr + ' ' + name + ' '+name1); //維度
//建立包含10個0的數組
Array.dim=function(dimension,initial){
var a=[],i;
for(i=0;i<dimension;i+=1){
a[i]=initial;
}
return a;
}
var myArray=Array.dim(10,0);
//給Array添加矩陣函數
Array.matrix=function(m,n,initial){
var a,i,j,mat=[];
for(i=0;i<m;i+=1){
a=[];
for(j=0;j<n;j+=1){
a[j]=initial;
}
mat[i]=a;
}
return mat;
}
//0填充4*4的矩陣
var myMatrix=Array.matrix(4,4,0);
document.writeln(myMatrix[3][3]); //0
//用來構造一個恒等矩陣的方法。
Array.identity=function(n){
var i,mat=Array.matrix(n,n,0);
for(i=0;i<n;i+=1){
mat[i][i]=1;
}
return mat;
};
myMatrix=Array.identity(4);
document.writeln(myMatrix[3][3]); //1