面向对象技术

什么是面向对象?

面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。

举一个?:
站在抽象的角度,人具有身高、体重、年龄、血型等一些特征,人会劳动、人都会直立行走、人都会吃饭、人都会用自己的头脑去创造工具等这些方法,人仅仅只是一个抽象的概念,它是不存在的实体,但是所有具备人这个群体的属性与方法的对象都叫人。这个对象人是实际存在的实体,每个人都是人这个群体的一个对象。

面向对象有哪些特征?

抽象、继承、封装、多态

  1. 抽象。
  2. 继承。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或增加新的方法
  3. 封装。是指将客观事物抽象成类,每个类对自己的数据和方法实行保护。
  4. 多态。是指允许不同类的对象对同一消息作出响应。

js实现继承
https://blog.csdn.net/weixin_41320197/article/details/89076112

js实现封装

/**
 * 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,
 * 都是存储在对象中的这样无形中就增加了开销
 */
var Person = function (name) {
    var _name;
    this.setName = function (name) {
        _name = name;
    }
    this.getName = function () {
        return _name;
    }
    this.setName(name);
}
Person.prototype = {
    constructor: Person,
    toString: function () {
        return "name = "+ this.getName();
    }
};
var p1 = new Person("小王");
console.log(p1.toString()); // name=小王
p1.setName("小刘");
console.log(p1.toString()); // name=小刘
p1.name = "小郑";
console.log(p1.toString()); // name=小刘

去掉了this.属性名,严格的实现了封装,只能通过getter,setter访问成员变量了,但是存在一个问题,所有的方法都存在对象中,增加了内存的开销。

/**
 * 闭包封装
 * 使用这种方式虽然可以严格实现封装,
 * 但是带来的问题是get和set方法都不能存储在prototype中,
 * 都是存储在对象中的 这样无形中就增加了开销
 */
var Person = (function () {
    var times = 0; // 共享变量
    return function (name) {
        console.log(times++); // 0,1,2
        var name;
        this.setName = function (name) {
            this._name = name;
        }
        this.getName = function () {
            return this._name;
        }
        this.setName(name);
    }
})();
Person.prototype = {
    constructor: Person,
    toString: function () {
        return "name=" + this._name; 
    }
};
var p1 = new Person("小王");
var p2 = new Person("小刘");
var p3 = new Person("小郑");

console.log(p1.toString());
console.log(p2.toString());
console.log(p3.toString());

上述代码,js引擎加载完后,会直接执行Person = 立即执行函数,然后此函数返回了一个子函数,这个子函数才是new Person所调用的构造函数,又因为子函数中保持了对立即执行函数中times的引用,(很明显的闭包)所以对于times,是所有Person对象所共有的,创建3个对象后,times分别为0,1,2 。这种方式的好处是,可以使Person中需要复用的方法和属性做到私有且对象间共享。

js实现多态

书里面的故事:本人家里养了一只鸡,一只鸭。当主人向他们发出‘叫’的命令时。鸭子会嘎嘎的叫,而鸡会咯咯的叫。转化成代码形式如下

非多态形式

/**
 * 非多态代码示例
 */
var makeSound = function (animal) {
    if (animal instanceof Duck) {
        console.log('嘎嘎');
    }
    else if (animal instanceof Chicken) {
        console.log('咯咯咯');
    }
}

var Duck = function () {}
var Chicken = function () {}
makeSound(new Chicken()); // 咯咯咯
makeSound(new Duck()); // 嘎嘎

多态代码

/**
 * 多态的代码示例
 */

 var makeSound = function (animal) {
     animal.sound();
 }
 var Duck = function () {}
 Duck.prototype.sound = function () {
     console.log('嘎嘎');
 }

 var Chicken = function () {}
 Chicken.prototype.sound = function () {
     console.log('咯咯咯');
 }

 makeSound(new Chicken()); //咯咯咯
 makeSound(new Duck()); // 嘎嘎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值