在javascript中this是强大,依据不同的上下文,this的内涵也是不一样的。下面有俩段关于继承的写法
function Person(name){ this.name=name; this.sayHello=function(){ console.info("I’m "+ this.name); }}function Employee(name,salary){ Person.call(this, name); this.salary=salary; this.showMeSalary=function(){ console.info(this.name+"hai $:"+this.salary); }}var bill=new Person("bill");var tom=new Employee("tom",5000);bill.sayHello();tom.sayHello();console.info(bill.sayHello==tom.sayHello);//=>false
方法由不同的对象调用,this的内容就会产生变化,而通过上面这种方法构造出来的对象每个this都含有一份自己的代码,
console.info(bill.sayHello==tom.sayHello);//=>false
而同一类对象却包含有相同的代码,这是一种浪费。
较为好的做法就是将可能重复利用的函数剥离出来。
function Person(name){//定义了基类构造函数 this.name=name;}Person.prototype.sayHello=function(){ alert("I'm "+this.name);}function Employee(name,salary){ Person.call(this, name);//调用基类构造函数 //Person.call(this, this.name);//调用基类构造函数这样是错误的,this.name从来没有被复制 this.salary=salary;}//这才是我熟悉的类似静态语言的继承Employee.prototype=new Person();//创建了一个基类对象作为子类原型的原型(原型继承) Employee.prototype.showMeSalary=function(){ alert(this.name+" has $:"+this.salary);}var bill=new Person("bill");var tom=new Employee("tom",5000);bill.sayHello();tom.sayHello();console.info(bill.sayHello==tom.sayHello);//true
总结:javascript中的this是静态语言中的类同时也是对象,这也符合javascript中类和对象同体的观念