面向对象
含义:面向对象是一种编程思想,”万物皆对象“。
面向对象包含哪些呢?
- 1、js中内置内
Number() / String() / Boolean() / Array().....都属于面向对象
- 2、单例设计模式:
var person={//person是命名空间
name:"lili"
}
- 3、高级单例设计模式:
var utils=(function(){
var num=0;
function total(){consele.log("total")};
function banner(){consele.log("banner")};
return{
total,
banner
}
})()
//外面可以通过utils.total()直接调用
- 4、工厂设计模式:函数
function cat(name){
return{
name
}
}
var cat1=person("八喜")
- 5、构造函数设计模式: 函数在执行时,一旦有new,这个函数就是构造函数(类),首字母一般大写,函数返回值就成了实例
function Fn(name){
this.name=name;//this是给当前实例添加,this指的是当前实例
};
var f1=new Fn("八喜");//实例和实例之间不相等,f1不等于f2
var f2=new Fn();
- 构造函数return问题
- 构造函数虽然没有return 但是new的内部处理了
- 如果return的是一个基本数据类型或者不写return,返回的就是当前这个实例
- 如果return的是一个引用数据类型,会替换掉默认的
- 在构造函数中要尽量避免使用return
instanceof
作用:判断某个实例是否属于某个类,返回值为布尔值
function Fn () { };
let f1 = new Fn();
console.log(f1 instanceof Fn);//true
in
作用:判断一个属性是否是一个对象的属性,无论是公有还是私有,返回值是布尔值
let obj = {
name: "cxh"
};
console.log("name" in obj);//true
//"属性名" in obj
hasOwnProperty
判断一个对象是否有这个私有属性,返回值是个布尔值
function Fn () {
this.name = "八喜";
};
let f1 = new Fn();
console.log(f1.hasOwnProperty("name"));//true
某个属性是否是私有的或公有的,其实不是绝对的,是相对的。
js创建值的两种方式
1、字面量
let obj={};
let str="hahaha";
2、构造函数方式
let obj=new Object();
let str=new String("hahaha");
注意:基本数据类型字面量创建,不是标准的实例,用instanceof检测返回false
原型链
!!!!在理解原型链的图前,请务必牢牢记住以下五句话!!!!!
1、所有的函数都有一个prototype属性,所有函数不包括箭头函数和对象内快捷方式的函数
2、prototype是一个对象(堆内存),它身上自带一个constructor属性,它指向当前构造函数,也就是那个类
3、所有的对象都有一个属性:__proto__,它指向所属类的原型
4、所有函数都是Function的实例
5、所有对象都属于Object的实例
注意:类就是函数,prototype和实例都是对象
原型链查找机制
先看自己私有有没有,没有就找他的原型,原型上没有继续基于__proto__向上查找,找到Object基类的原型为止,没有就无法使用,查找为undefined。