1.其实很多人认为js是一门解释性语言,但实际它是一门编译语言,只是与传统编译语言有所不同而已,这里不再细说.......
2.js面向对象
封装
继承
多态
JavaScript是一款基于原型模式的面向对象语言
为了更好达到封装效果,可以通过一个function来统一构建一个势力
function test(name,age){
return {
name : name,
age : age,
male: false,
startWork : function(){
// code here;
}
};
};
这样更像构造函数:
function test(name,age){
this.name = name;
this.age = age;
this.male= false;
<span style="white-space:pre"> this.startWork = function(){
<span style="white-space:pre"> </span>if(this.isWorking) return;
<span style="white-space:pre"> </span>this.isWorking = true;
<span style="white-space:pre"> </span>};</span>
}
//通过new关键字实例化
var tom = new test("tom", 24);
var zs=new test("zs",34);
document.write(tom.startWork == zs.startWork) //false
我们还可以发现tom和zs的startWork并不指向不一个内存,也就意味着,当我们有很多实例的时候,内存开销会非常大
仅仅通过构造函数创建实例,他们的成员并不共用,很明显这不是一个好的实现方法。
prototype:原型。任何类型都会有属于自己的原型,并且原型上定义的成员,可以在每个实例中引用,并且是共用的
<pre name="code" class="javascript">function worker(name, age){
this.name = name;
this.age = age;
this.isWorking = false;
}
worker.prototype.startWork = function(){
if(this.isWorking) return;
this.isWorking = true;
};
worker.prototype.endWork = function(){
if(this.isWorking) return;
this.isWorking = true;
};
//在此处尝试定义一个endWork方法
var tom = new worker("tom", 40);
var jim = new worker("jim",20);
tom.startWork == jim.startWork //true
</pre><pre>
那么在设计JavaScript面向对象类型的时候,我们一般遵循以下规则:
- 因为实例不同而不同的内容,用this关键字声明
- 无论实例怎样内容完全相同的成员,定义在prototype上