本文主要是介绍第四阶段 — jsoo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、jsoo介绍
1、概念:jsoo称为js面向对象,又可以叫做js高级。
oo:面向对象 — 以类为基础(java)
oop:面向对象编程
面向对象编程:类和对象(类是对象的抽象,对象是类的实例)
面向对象它是一种思想,任何语言都可以用,js中也可以使用。
2、js面向对象(原型对象、实例对象)— 基于原型,只有对象没有类
(原型对象是实例对象的抽象,实例对象是原型对象的实例)
原型对象就是模板。示例:
function prototyPlane(x,y,imgSrc,speed){this.x = x;this.y = y;this.imgSrc = imgSrc;this.speed = speed;this.moveDown = function(){}this.init = function(){}
}
let newPlane = new prototypePlane();
3、面向对象的三大特性:封装、继承、多态
封装:隐藏内部实现,暴露接口(重点)
继承:共性
多态:个性
拓展:面向过程 — 以函数为基础(C语言、C++)
顶层对象为Object(null)
二、创建对象的方法
1、构造函数的方法
function test(name,age){//let this = new Object();this.name = name;this.age = age;//return this;
}
new test();
2、工厂方法
function test(name,age){let obj = new Object();obj.name = name;obj.age = age;obj.hi = function(){}return obj;
}
3、原型
function test(){}
test.prototype.name = xxx;
test.prototype.age = xxx;
4、
var obj = new Object();
obj.name = "zhangsan";
obj.age = 18;
obj.sayHi = function(){}
5、
var obj = { //语法糖name:'lisi',age:16,sayHi:function(){}
}
6、重点
Object.create(); //重点
var obj = Object.create(null); //等价于var obj = new Object()或var obj = {}
Object.create(proto,[propertiesObject])
三、引用类型(堆)与原始类型(栈)
引用类型的拷贝默认是浅拷贝,如何让其实现深拷贝?
var arr = [123,545,34];
function change(arr2){arr2 = [];
}
change(arr);
console.log(arr);
原始类型的拷贝:相当于钱的复制
引用类型的拷贝:相当于卡的复制
垃圾回收机制(防止内存的溢出):没有任何变量指向它时,就会被回收。
四、__proto__属性
__proto__属性:js语言内部实现,私有的一个属性。追溯自身来源(顶层Object.Object.__proto__是null)。
IE浏览器中不支持__proto__属性。
实例对象.__proto__
prototype属性:专门提供给用户进行原型的操作。只有函数对象有这个属性。
什么是函数对象?什么是普通对象?
函数对象:typeof对象,如果为function,就说明它是函数对象。
__proto__与prototype区别:
1、 __proto__是一个私有属性,IE不支持;prototype是一个开发接口。
2、__proto__是js内部用于追溯自身原型的属性,是任何对象都有的属性;prototype属性只有函数属性有。
3、建议使用prototype属性来进行原型相关的操作。
xiaoai.__proto__ === Student.prototype //true
xiaoai.__proto__.constrctor === Student //true
Student.prototype.constrctor === Student //true
五、原型链
工作模式:从自身出发,一层一层向上找,直到找到为止。没有找到就返回undefined。
原型对象,new出来对象两不同的对象。
注:如果你想要继承另一个对象里定义的属性(构造函数),需要将原型只想另一个对象的示例。
使用场景:处理日期
Date.prototype.toDoubleyongString = function(str){var d = new Date(str);var year = d.getFullYear();
}
六、对象的操作
1、销毁对象
var obj = new Object();
obj = null;
2、删除对象的属性
var zhangsan = {name:'zhangsan',age:18
}
delete zhangsan.age;
3、检查某个对象是否为某个构造函数的实例
检查的对象instanceof构造函数:返回true或false。
4、判断某个对象是否包括某个属性:返回true或false(整个原型链上进行判断)
in关键字,示例:
console.log("name" in zhangsan);
5、判断是否是对象自身的属性hasOwnProperty
zhangsan.hasOwnProperty("toString")
七、作用域
全局变量:函数外定义的变量
局部变量:函数内定义的变量
注:全局变量都可以访问;局部变量只有定义它的函数可以访问。
变量与函数的提升
变量的定义和函数的定义,两者会提升
(浅拷贝、深拷贝、for...in、for...of、es6中数组的方法)
原理:高内聚、低耦合
这篇关于第四阶段 — jsoo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!