面向对象的概念:
JavaScript并不是面向对象的程序设计语言,面向对象设计的基本特征:继承、多态等没有得到很好的实现。在纯粹的面向对象语言里,最基本的程序单位是类,类与类之间提供严格的继承关系。比如Java中的类,所有的类都可以通过extends显式继承父类,或者默认继承系
统的Object类。而JavaScript并没有提供规范的语法让开发者定义类。
在纯粹的面向对象程序设计语言里,严格使用new关键字创建对象,而new关键字调用
该类的构造器,通过这种方式可以返回该类的实例。

由于JavaScript的函数定义不支持继承语法,JavaScript 没有完善的继承机制。因此习惯
上称JavaScript是基于对象的脚本语言。

javascript的继承机制:

function Person (name,age){
	this.name=name;
	this.age=age;
	this.info=function(){
		console.log("姓名: " + this.name);
		console.log("年龄: " + this.age);
		}
}
var per = new Person('八戒',22);
per.info();

代码中在定义Person函数的同时,也定义了一个Person类,而且该Person函数就是Person类的构造器,该构造器不仅为Person 实例完成了属性的初始化,还为Person实例提供
了一个info方法。
但使用上面方法为Person类定义增加info方法相当不好,主要有如下两个原因。

➢性能低下:因为每次创建Person实例时,程序依次向下执行,每次执行程序中粗体字
代码时都将创建一个新的info函数一当创建 多个Person 对象时,系统就会有很多个
info函数一这 就会造成系统内存泄漏,从而引起性能下降。实际上,info 函数只需
要一个就够了。
➢使得info函数中的局部变量产生闭包:闭包会扩大局部变量的作用域,使得局部变量
一直存活到函数之外的地方。
**为了避免这两种情况,通常不建议直接在函数定义(也就是类定义)中直接为该函数定义
方法,而是
建议使用prototype属性。**即JavaScript提供的伪继承机制

使用apply或者call实现伪继承:

function Animal (sex,age,message){
	this.sex=sex;
	this.age=age;
	this.message=message;
}
Animal.prototype.info = function(){
	console.log(this.sex +", "+this.age +", "+this.message);
}
function Dog (sex,age,message,ty){
	Animal.apply(this,[sex, age,message]);
	this.ty=ty;
}
Dog.prototype = new Animal();
Dog.prototype.sayHello=function(){
	console.log(this.ty +"汪汪汪");
}
var dog= new Dog("公",34,"不咬人","金毛");
dog.info();
dog.sayHello();
function Cat (sex,age,message,ty){
	Animal.apply(this,[sex, age,message]);
	this.ty=ty;
}
Cat.prototype = new Animal();
Cat.prototype.sayHello=function(){
	console.log(this.ty +"汪汪汪");
}
var cat= new Cat("母",34,"不咬人","波斯猫");
cat.info();
cat.sayHello();

javascript是面向对象 javascript 面向对象_javascript