javascript定义类的方法

本文介绍了在JavaScript中模拟类的三种方法:构造函数法、Object.create()法和极简主义法。每种方法都有其特点,如构造函数法适用于定义公共方法和属性,而极简主义法则更易于实现继承和封装。

javascript本身不支持类,但可以通过以下方法模拟出类。

  1. 构造函数法
  2. Object.create()法
  3. 极简主义法

1、构造函数法

    function Person() {
        this.type = '人'
    }

    var person1 = new Person();
    console.log(person1.type);      // 人

    Person.prototype.run = function(){
        console.log('我在跑');
    }

使用构造函数模拟‘类’,在构造函数内部使用this指向实例对象。
生成实例的时候使用new 关键字。
类的属性和方法,也可以定义在原型上。构造函数的prototype对象。

2、Object.create()法

    var Person = {
        type: '人',
        run: function(){
            console.log('我在跑');
        }
    }

    var person1 = Object.create(Person);
    console.log(person1.type);      // 人
    person1.run();      // 我在跑
    如果浏览器不支持Object.create方法,可以自己创建。

    if(!Object.create){
        Object.create = function(o){
            function F(){};
            F.prototype = o;
            return new F();
        }
    }

这种方法比”构造函数法”简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对”类”的模拟不够全面。

3、极简主义法

荷兰程序员Gabor de Mooij提出了一种比Object.create()更好的新方法,他称这种方法为”极简主义法”(minimalist approach)。

封装

首先,它也是用一个对象模拟”类”。在这个类里面,定义一个构造函数createNew(),用来生成实例。

然后,在createNew()里面,定义一个实例对象,把这个实例对象作为返回值。

使用的时候,调用createNew()方法,就可以得到实例对象。

    var Person = {
        createNew: function(){
            var Person = {};
            Person.type = '人';
            Person.run = function(){
                console.log('我在跑');
            }
            return Person;
        }
    }

    var person1 = Person.createNew();
    person1.run();      // 我在跑
继承

让一个类继承另一个类,实现起来很方便。只要在前者的createNew()方法中,调用后者的createNew()方法即可。

    var Male = {
        createNew: function(){
            var male = Person.createNew();
            male.type = '男';
            male.swim = function(){
                console.log('我在游泳');
            }

            return male;
        }
    }

    var male1 = Male.createNew();
    male1.swim();
私有属性和私有方法

在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。

    var Male = {
        createNew: function(){
            var male = Person.createNew();
            var swim = '我在游泳';
            male.doSwim = function(){
                console.log(swim);
            }

            return male;
        }
    }

    var male1 = Male.createNew();
    male1.doSwim();
    male1.swim;     // undefined
数据共享

有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可。

    var Male = {
        place:'南海',
        createNew: function(){
            var male = Person.createNew();
            male.doSwim = function(){
                console.log('我在'+Male.place+'游泳');
            }
            male.changePlace = function(place){
                Male.place = place;
            }

            return male;
        }
    }

    var male1 = Male.createNew();
    male1.doSwim();
    var male2 = Male.createNew();
    male2.changePlace('北海');
    male1.doSwim();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值