天天看点

JavaScript面向对象,构造函数和prototype属性

1.面向对象的基本理解

在面向对象(OOP,Object Oriented Programming)的编程中,总是从编写类开始的,而类是对象的抽象,就是描述了对象应该具有的所有属性和方法,本质上我们还是在编写对象。

长篇的面向对象概念可以参考百度百科-OOP

2.JAVASCRIPT中自定义类

两个概念:

(1) 内建类:我们的代码运行之前就在堆中建立的类,比如Date、String、Number等;

(2) 自定义类:我们自己编写的类。

新建一个类People:

// 不带参数
function People(){
    this.name = "dhs";
    this.height = ;
    this.show = function(){
        alert(this.name + "||" + this.height);
    }
}
// 带参数
function People(name,height){
    this.name = name;
    this.height = height;
    this.show = function(){
        alert(this.name + "||" + this.height);
    }
}
           

格式:

function 类名(arg_1,arg_2,…){

// 类体

}

在JS中自定义类使用function关键字,和自定义函数类似,不过类的属性和方法需使用this关键字。

var p = new People(); // 新建一个People类的实例对象p
alert(p.name);
alert(p.height);
p.show();
           

new People() 就是调用了类People的构造函数,这个构造函数放在这个实例对象的constructor属性当中,而类的构造函数就是类本身这段代码的定义,使用p.constructor就可以验证,但是内建类调用这个属性,无法获得它的定义

JavaScript面向对象,构造函数和prototype属性

使用prototype属性定义类:

function People(){}
People.prototype.name = "dhs";
People.prototype.height = ;
People.prototype.show = function(){
    alert(this.name + "||" + this.height);
}
           

使用prototype属性定义的类,和上面使用函数定义的方式,使用效果上一样,但无法使用构造器参数,因为构造函数都是空的。prototype是我们新建函数(类)的时候自动添加到函数上的,这个属性用来存放函数的构造函数、默认的属性和父类等信息,使用People.prototype查看效果

JavaScript面向对象,构造函数和prototype属性

从上图可以看出来,使用prototype定义属性和方法,是将这些属性和方法直接放在对应的prototype属性中,而不是添加到构造函数中,但是这些存放在prototype中的属性和方法同样会被实例对象(var p = new People())所持有,为此使用new关键字实例化的时候,是调用了类的构造函数,同时将prototype的所有属性赋给这个新的实例对象。

使用 { } 新建一个实例对象:

var p = {
    name : "dhs",
    height : ,
    show : function(){
        alert(this.name + "||" + this.height);
    }
}
           

这种方式新建的对象没有prototype属性,因为这个属性在新建函数时会添加,它也是function对象才有属性。也可以叫这种对象为JSON对象,它符合JSON的书写风格。

3.用或不用this关键字

在定义类的时候使用this关键字,就是将这个属性或方法设置为公共的属性或方法,类似于JAVA中public,例如this.name = “dhs”。而使用var关键字,var name = “dhs”,则这个属性或方法就成了局部变量或方法,只能在函数体内部访问,就相当于私有变量了,类似于JAVA中的private,如果想要外部访问,可以定义get和set方法

function People(){
    var _name = "dhs";
    this.setName = function(name){
        _name = name;
    }
    this.getName = function(){
        return _name;
    }
}
           

var p = new People(),使用p._name会得到undefined,只有p.getName()才可以正确访问name的值,p.setName(“zzz”)可以设置_name的值。

继续阅读