1.基本概念
如果你的脚本都是对象之间的交互操作那么就可以说这个脚本就是面向对象的脚本。即面形对象的javascript
2.提出问题
这里就提出自己曾经的疑惑之处:javascript并不是面向对象的语言为什么却有面向对象的javascript?
3.解决问题
首先需要明白一种关系:面向对象是一种编程思想,它和各种编程语言都是相互独立的。但是这种思想依赖编程语言来实现或者展示出来
搞清楚这件事情之后再回头来看面向对象的javascript。javascript本身是一种语言,他只是我们使用的一种工具,而对于编程我们使用何种思想完全取决于我们自己和我们使用的工具没有半毛钱关系。当我们自己决定使用面向对象的思想进行编程了,那么就要使用javascript这个工具来实现我们的这种思想,这就是面向对象的javascript
总结成为一句话:思想没变,形式改变!
到此为止就可以看出,其实javascript面向对象只需要熟悉一下形式就能够比较好的了解这一部分的内容!
但是由于javascript本身不是纯正的面向对象语言所以我们需要使用javascript语言本身特性进行一个面向对象相关知识的模拟。
4.javascript简单对象创建与属性操作
1.类的定义
使用function
2.公有属性和方法的定义
使用this
需要简单介绍一些this关键字
3. 介绍js中特有的一种对象---原型对象
公有属性在构造函数中定义 公有方法在原型对象上定义
需要介绍一下原型对象
4. 私有属性和方法定义
使用var ---利用局部变量来模拟私有属性和方法
3. 静态属性和方法定义
使用staticValue
/*1.js中类的定义*/
//js中的类定义,需要靠function来模拟
//第一种方式:
function Teacher(){
}
//第二种方式:
//建议采用下面的形式定义一个js中的类,可以和普通的function进行区分
//建议类名首字母大写,以便更好的和普通的function进行区分
var Teacher = function(){
};
/*2.js中类中属性的定义*/
//定义一个Book类,这个function还承担模拟构造函数的工作
//在使用new操作符创建Book类的对象时,这个function中的代码会被执行
var Book = function(name){
//定义类的公有属性
this.name = name;
//定义类的公有的方法
this.getName = function(){
return this.name;
};
//定义类的公有的方法
this.setName = function(name){
this.name = name;
};
};
/*3.利用原型对象对Book类进行一个改造*/
//一种更为合适的公有属性和方法定义
var Book = function(name){
//Book.prototype.name = name; 原型对象定义属性
//公有属性定义:在构造方法中定义
this.name = name;
if(typeof Book._init === "undefined"){
//公有方法在原型对象上定义
//原型对象定义方法
Book.prototype.setName = function(name){
this.name = name;
};
Book.prototype.getName = function(){
return this.name;
};
Book.prototype.getCount = function(){
addCount();
return count ;
};
}
Book._init = true;
//利用局部变量来模拟私有属性和方法
//定义的私有属性
var count = 0;
//定义的私有方法
var addCount = function(){
count++;
};
};
/*4.定义公有静态属性和静态方法*/
//定义公有静态属性
Book.staticValue = 10;
//定义公有静态方法
Book.changeValue = function(){
Book.staticValue++;
};
4.模拟父子类的继承
Function.prototype.extend = function(parent){}
5.模拟接口及类实现接口
Inter.prototype.test = undefined;//定义接口的方法为undefined,这样如果实现接口的类没有实现这个方法。一旦调用这个方法就会爆出undefined
/*4.一个用于子类继承父类属性的方法*/
//两种方式
//第一种方式:使用遍历
Function.prototype.extend = function(parent){
//当前类的原型中的东西全部保留再增加了一些父类的方法
//这个是两种定义方式的区别
for(var proName in parent.prototype){
this.prototype[proName] = parent.prototype[proName];
}
};
//第二种方式
Function.prototype.extend = function(parent){
//将原型对象进行了一个完全的重定义
this.prototype = new parent();
};
//1.1.定义父类
var People = function(name){
//构造函数定义公有属性
this.name = name;
this.show = function(){
alert(this.name);
};
};
//定义两个公有方法--通过原型对象的方式
People.prototype.getName = function(){
return this.name;
};
People.prototype.setName = function(name){
this.name = name;
};
/*5.实现接口*/
//5.1.定义接口的方法为undefined,这样如果实现接口的类没有实现这个方法。一旦调用这个方法就会爆出undefined
Inter.prototype.test = undefined;
//5.2.定义子类
var Teacher = function(parent,name){
parent.call(this,name);
//apply
//parent.apply(this,new Array(name))
};
Teacher.extend(People); //继承父类的语句
//5.3需要实现一个接口语句
Teacher.extend(Inter);
//定义公有方法-通过原型对象的方式
Teacher.prototype.getName = function(){
return "老师:" + this.name;
};
//5.4具体实现一个接口的方法
Teacher.prototype.test = function(){
alett("实现接口的方法");
};