一、什么是面向对象?
找解决问题对象,如果对象存在,调用对象相关功能方法解决问题,如果对象不存在,自己封对象实现功能。
//纯javascript代码实现,还是函数实现
//1 .纯javascript代码实现
const splitStrOne = () => {
let s = 'html_javascript_css'; // [html,javascript,css]
//分析: 遍历每一个字符,判断是否_,如果不是_,拼接成字符串存储入数组,
let array = []
let str = '';
for (let i = 0; i < s.length; i++) {
const item = s.charAt(i);
if (item != '_') {
str = str + item; //str: h str:ht str:htm str:html str:html str:css
} else {
array.push(str); // [html]
str = '';
}
if (s.length - 1 == i) {
array.push(str); // [html]
str = '';
}
}
console.log(array);
}
//2. 纯函数方式实现
const splitStrTwo = ()=>{
let s = 'html_javascript_css'; // [html,javascript,css]
const array = s.split('_');
console.log(array);
}
splitStrTwo();
如上代码块:
解决问题的过程:面向过程
使用对象解决问题:面向对象
二、创建对象的方式
1、new Object()
let person = new Object();
person.name = "小明";
person.age = 18;
person.sayName = function(){}
2、字面量
let person = {
name:"小明",
age:"18",
sayName = function(){}
}
3、工厂函数
用函数来封装创建对象的细节,在函数里面创建对象并返回对象,就有些像工厂里的流水线一样。
function Person(name,age){
return {
name:name,
age:age;
sayName: function0{}
}
缺点:对象识别问题,它不知道一个对象的类型。
4、构造函数
是一种特殊的函数,函数名就是类型名,函数体定义类的属性和方法,通过给构造函数传递不同的参数,然后调用构造函数来创建不同对象。
可以将它的实例标识为一种特定的类型,这正是构造函数模式胜过工厂模式的地方。
比如(instanceof用于检测对象类型)
let person1 = new Person("小明",29);
person1 instanceof Person //true
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){}
}
//使用构造函数创建实例对象
let p1 = new Person("小明","18")
缺点:每个方法都要在每个实例对象上重新创建一遍,即使是同名方法或者两个方法的作用一样,而不同实例对象上的同名方法其实是不一样的,这样就造成了一种冗余。
构造函数示例:
<body>
<div id="app">
构造函数点击
</div>
</body>
//用面向对象方式实现 ,点击按钮改变区块颜色
const element = document.getElementById('app')
function ChangeColor(color) {
this.backgroundColor = color;
this.init = function () {
element.onclick = function () {
element.style.background = color
}
}
}
//创建实例对象p1
let p1 = new ChangeColor('red');
p1.init();
5、原型模式
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayName = function(){
alert(this.name);
};
let person1 = new Person("小明",18);
let person2 = new Person("小张",18);
//结果:小明 小张
//使用原型模式使实例的对象都能使用,不用去重复实例对象的方法
所有的属性和方法都是大家(所有实例)共享的了,person1和person2访问的sayName和name等 都是同一个方法
重写原型的时候,切断了现有原型与任何之前已存在的对象实例之间的联系,它们引用的仍是最初的原型。可以通过在重写原型里添加constructor:Person来建立新联系。
三、对象存储
变量:在内存开辟存储空间变量名指向内存地址(栈)(内存中的存储单元)
对象:内存堆区域开辟的空间(大小取决于对象的大小,方法多少)
实例对象:栈区域的变量指向堆区域所在的对象地址(从头到尾)
数据存储结构
网友评论