学过Java的小伙伴都知道,有对象那一定有类,因为类是对象的模板,对象是类的实例。Java中的面向对象的思想已经很成熟了,我们来看一下在JS中能不能做到像Java那样面向对象编程。
1.Java中创建对象
//创建类
public class Dog(){
private String name;
private String type;
public Dog(String name,String type){
this.name = name;
this.type = type;
}
public String introduce(){
return name + "的种类是" + type;
}
}
//创建对象
Dog dog1 = new Dog("菲菲","中华田园犬");
Dog dog2 = new Dog("可可","金毛");
1-1创建对象的步骤
1.new //创建对象的关键字
2.Dog("菲菲","中华田园犬"); //构造函数的调用
JS里面是没有类这个概念的,那么对象又是如何创建的呢?庆幸的是,虽然JS中没有类这个概念,但是JS中有构造函数这个概念。现在我们就用构造函数创建一个对象。
2.JS中创建对象
//构造函数
function Dog(name,type){
this.name = name;
this.type = type;
this.introduce = function(){
return this.name + "的种类是" + this.type;
}
}
//创建对象
var dog1 = new Dog('菲菲','中华田园犬');
var dog2 = new Dog('可可','金毛');
由于我们对Java中面向对象的思想印象深刻,所以我们想象的JS中的对象应该也像Java中的对象一样,事实真的如此吗?
3.对比Java与JS中的对象
仔细观察就会发现:
JS中的构造函数中把方法也包括进来了,这个在Java中并没有。
1.学过Java的都知道this表示对象指针,既然Java中没有this.introduce,是不是说introduce方法不属于某一个对象呢?准确的来说并没有错,因为它是所有Dog类的实例化对象共享的。
2.反过来看JS,很明显introduce方法属于对象,dog1、dog2、dog3、...dog100都有这样一块内存区域保存着这个方法。
4.ES6语法(最新)中的JS对象
//创建类
class Dog{
constructor(name,type){
this.name = name;
this.type = type;
this.introduce = function(){
return this.name +"的种类是"+ this.type
};
};
};
//创建对象
var dog1 = new Dog('菲菲','中华田园犬');
var dog2 = new Dog('可可','金毛');
ES6中出现了class关键字与constructor(构造函数),与Java的相似度更高了,理解起来也更容易了。
5.总结
在JS中把这种属于对象的方法与属性(this指向的)称为自有属性。
从内存的角度来说:在Java中,属性是属于对象的,而方法是同一个类的所有对象共享的;但是在JS中,无论是属性还是方法都是属于对象的。
大家可能会问到,JS能不能做到像Java一样的,是可以的,这就需要借用原型方法。
注释:后续所有关于JS中面向对象的论述都会与Java中的面向对象进行对比。