什么是面向对象?
面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
举一个?:
站在抽象的角度,人具有身高、体重、年龄、血型等一些特征,人会劳动、人都会直立行走、人都会吃饭、人都会用自己的头脑去创造工具等这些方法,人仅仅只是一个抽象的概念,它是不存在的实体,但是所有具备人这个群体的属性与方法的对象都叫人。这个对象人是实际存在的实体,每个人都是人这个群体的一个对象。
面向对象有哪些特征?
抽象、继承、封装、多态
- 抽象。
- 继承。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或增加新的方法
- 封装。是指将客观事物抽象成类,每个类对自己的数据和方法实行保护。
- 多态。是指允许不同类的对象对同一消息作出响应。
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()); // 嘎嘎