1. JavaScript灵活性
用不同方式定义方法:
1. 使用方法定义的方式
function startAnimation() {
...
}
function stopAnimation() {
...
}
2. 使用原形方式
var Anim = function() {
...
};
Anim.prototype.start = function() {
...
};
Anim.prototype.stop = function() {
...
};
var myAnim = new Anim();
myAnim.start();
...
myAnim.stop();
3. 使用另一种不同的方式
var Anim = function() {
...
};
Anim.prototype = {
start: function() {
...
},
stop: function() {
...
}
};
4. 为Function类添加方法用于声明方法
Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
};
var Anim = function() {
...
};
Anim.method('start', function() {
...
});
Anim.method('stop', function() {
...
});
5. 链式调用
Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
return this;
};
var Anim = function() {
...
};
Anim.
method('start', function() {
...
}).
method('stop', function() {
...
});
2. 弱类型语言
在JavaScript中,定义变更时不必声明其类型。并不意味着变更没有类型,一个变量可以属于几种类型之一,这取决于其包含的数据。
JavaScript中有五种原始值:Undefined,Null,Boolean,Number,String
Undefined数据类型的值只有一个:undefined
在js中如果只声明了一个引用,没有值,那么它的值默认就是undefind.
Null数据类型的值只有一个:null
Boolean数据类型的值只有两个:true,false
Number任何整数、浮点值都是在number里的值
typeof的返回值有五个:undefined,boolean,number,string,object
null与undefined的关系:undefined实际上从null派生而来
alert(null == undefined);
对于函数定义中的变量来说,加var表示局部变量,不加var表示全局变量
强制转换有三种:Boolean(value),Number(value),String(value)
String s = ‘s’ alert(typeof s) string // 是原始值,放在栈里
String s = new String(‘s’); alert(typeof s) object // 对象,放在堆里
3. 函数
在JavaScript中,函数是一等对象。它们可以存储在变更中,可以作为参数传给其它函数,可以作为返回值从其它函数传出,还可以在运行时进行构造。
可用function() {..}这样的语法创建匿名函数。它们没有函数名,但可以被赋给变量
(function() {
var foo = 10;
var bar = 2;
alert(foo * bar);
})();
(function(foo, bar) {
alert(foo * bar);
})(10, 2);
var baz = (function(foo, bar) {
return foo * bar;
})(10, 2);
4. 对象的易变性(晚绑定)
早绑定:是指在实例化对象之前定义它的特性和方法,这样编译器或解释程序就能提前转换机器代码。
晚绑定:指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需要检查对象是否支持特性和方法即可
JavaScript的对象具有易变性。这意味着能使用一些在大多数别的语言中不能使用的技术,例如为函数加属性:
function displayError(message) {
displayError.numTimesExecuted++;
alert(message);
};
displayError.numTimesExecuted = 0;
上面例子意味着你可以对先前定义的类和实例化的对象进行修改;
// 定义一个person类
function Person(name, age) {
this.name = name;
this.age = age;
}
// 定义其方法
Person.prototype = {
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
}
}
// 实例化对象
var alice = new Person('Alice', 93);
var bill = new Person('Bill', 30);
// 修改类,再为其添加一个方法
Person.prototype.getGreeting = function() {
return 'Hi ' + this.getName() + '!';
};
// 修改特定的实例
alice.displayGreeting = function() {
alert(this.getGreeting());
}
var o = new Object();
o.name = "langsin";
alert(o.name);
delete o.name;
alert(o.name);